<?php
defined('BASEPATH') OR exit('No direct script access allowed');

/**
 * MY_permission Helper
 *
 * Sediakan fungsi global can() yang menggunakan Menu_model
 * untuk cek izin secara dinamis berdasarkan database.
 *
 * CARA PAKAI:
 *   Di autoload.php tambahkan: $autoload['helper'] = ['my_permission', ...];
 *   Di controller juga bisa load manual: $this->load->helper('my_permission');
 *
 * CONTOH:
 *   <?php if (can('iuran', 'view')): ?>
 *     <a href="...">Iuran</a>
 *   <?php endif; ?>
 *
 *   <?php if (can('warga', 'delete')): ?>
 *     <button>Hapus</button>
 *   <?php endif; ?>
 */

if (!function_exists('can')) {
    /**
     * Cek apakah user yang sedang login punya izin terhadap modul + aksi tertentu.
     *
     * @param  string $slug   Slug modul (sesuai tabel menu_modules.slug)
     * @param  string $action view|create|edit|delete  (default: view)
     * @return bool
     */
    function can($slug, $action = 'view') {
        $CI =& get_instance();

        // Jika belum login, selalu false
        if (!$CI->session->userdata('logged_in')) {
            return false;
        }

        $role = $CI->session->userdata('role');

        // Cache permission per request agar tidak query berkali-kali
        static $_perm_cache = [];
        $cache_key = $role . '|' . $slug . '|' . $action;

        if (isset($_perm_cache[$cache_key])) {
            return $_perm_cache[$cache_key];
        }

        // Load model jika belum
        if (!isset($CI->Menu_model)) {
            $CI->load->model('Menu_model');
        }

        $result = $CI->Menu_model->can($role, $slug, $action);
        $_perm_cache[$cache_key] = $result;
        return $result;
    }
}

if (!function_exists('can_any')) {
    /**
     * Cek apakah user punya minimal SATU dari beberapa aksi pada modul.
     *
     * @param  string $slug
     * @param  array  $actions  ['view','edit']
     * @return bool
     */
    function can_any($slug, array $actions = ['view']) {
        foreach ($actions as $action) {
            if (can($slug, $action)) return true;
        }
        return false;
    }
}

if (!function_exists('is_menu_visible')) {
    /**
     * Shortcut: apakah menu tampil (can_view = 1 dan modul aktif).
     * Ini yang dipakai di sidebar untuk show/hide item.
     *
     * @param  string $slug
     * @return bool
     */
    function is_menu_visible($slug) {
        return can($slug, 'view');
    }
}

if (!function_exists('get_role_permissions_map')) {
    /**
     * Ambil semua permission role saat ini sebagai map.
     * Berguna jika ingin cek banyak modul sekaligus tanpa N query.
     *
     * @return array [ slug => (object){can_view, can_create, can_edit, can_delete} ]
     */
    function get_role_permissions_map() {
        $CI   =& get_instance();
        $role = $CI->session->userdata('role');
        if (!$role) return [];

        if (!isset($CI->Menu_model)) {
            $CI->load->model('Menu_model');
        }
        return $CI->Menu_model->get_permissions_for_role($role);
    }
}