<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;
use Spatie\Permission\PermissionRegistrar;

class PermissionSeeder extends Seeder
{
    public function run()
    {
        // Reset cached roles and permissions
        app()[PermissionRegistrar::class]->forgetCachedPermissions();

        // DAFTAR LENGKAP HAK AKSES SISTEM ERP (Frontend & Backend Terintegrasi)
        $permissions = [
            // 1. DASHBOARD & LAPORAN ANALITIK
            'akses_dashboard', 
            'lihat_laporan_penjualan', 
            'lihat_laporan_piutang', 
            'lihat_laporan_pembelian', 
            'lihat_laporan_salesman',

            // 2. MODUL PENJUALAN
            'lihat_penjualan', 'buat_penjualan', 'edit_penjualan', 'batal_penjualan', 'hapus_penjualan',
            'lihat_retur_penjualan', 'buat_retur_penjualan', 'otorisasi_retur_penjualan',
            'otorisasi_kredit',

            // 3. MODUL PEMBELIAN (PURCHASING)
            'lihat_pembelian', 'buat_pembelian', 'edit_pembelian', 'batal_pembelian', 'hapus_pembelian',
            'lihat_retur_pembelian', 'buat_retur_pembelian',

            // 4. MODUL GUDANG & INVENTORY
            'lihat_stok', 
            'buat_mutasi_stok', 'otorisasi_mutasi_stok', 
            'buat_opname', 'otorisasi_opname',

            // 5. MODUL PENGIRIMAN (DELIVERY)
            'lihat_pengiriman', 'atur_jadwal_kirim', 'konfirmasi_pod',

            // 6. MODUL KEUANGAN KAS & BANK
            'lihat_kas_bank', 'buat_transaksi_kas', 'edit_transaksi_kas', 'batal_transaksi_kas',
            'lihat_piutang', 'terima_pembayaran_piutang',
            'lihat_hutang', 'buat_pembayaran_hutang',

            // 7. MODUL AKUNTANSI (ACCOUNTING)
            'lihat_jurnal', 'buat_jurnal_manual', 'edit_jurnal', 'batal_jurnal',
            'lihat_buku_besar', 'lihat_laba_rugi', 'lihat_neraca',

            // 8. MODUL SALES KANVAS
            'lihat_kanvas', 'buat_kanvas',

            // 9. MASTER DATA (PRODUK & HARGA)
            'lihat_produk', 'tambah_produk', 'edit_produk', 'hapus_produk',
            'atur_harga_bertingkat', 'atur_promo_diskon', 'kelola_kategori_biaya', 'kelola_kategori_produk',
        

            // 10. MASTER DATA (RELASI)
            'lihat_pelanggan', 'tambah_pelanggan', 'edit_pelanggan', 'hapus_pelanggan', 'atur_limit_kredit',
            'lihat_supplier', 'tambah_supplier', 'edit_supplier', 'hapus_supplier',
            'kelola_master_kompetitor',
            
            // 11. MASTER DATA (SDM & ARMADA)
            'lihat_salesman', 'tambah_salesman', 'edit_salesman', 'kelola_master_salesman',
            'lihat_armada', 'tambah_armada', 'edit_armada', 'kelola_master_kendaraan',

            // 12. PABRIKASI
            'lihat_formulas', 'buat_formulas', 'edit_formulas', 'hapus_formulas',
            'lihat_spk_produksi', 'buat_spk_produksi', 'selesaikan_spk_produksi', 'lihat_laporan_produksi',
            
            // 13. PENGATURAN SISTEM
            'lihat_user', 'tambah_user', 'edit_user', 'hapus_user','ganti_password',
            'atur_hak_akses', 'atur_cabang_gudang', 'pengaturan_sistem',
            'kelola_master_wilayah', 'kelola_coa'
        ];

        // Looping untuk memasukkan semua hak akses ke database
        foreach ($permissions as $permission) {
            Permission::firstOrCreate(['name' => $permission]);
        }

        // =========================================================
        // PEMBUATAN ROLE (Diambil dari struktur database yang ada)
        // =========================================================
        $roles = [
            'owner', 'super_admin', 'admin', 'manager', 'supervisor_admin', 'supervisor_sales',
            'admin_sales', 'admin_gudang', 'kepala_gudang', 'kasir', 
            'salesman', 'driver', 'helper'
        ];

        foreach ($roles as $roleName) {
            $role = Role::firstOrCreate(['name' => $roleName]);
            
            // Khusus Owner dan Super Admin, berikan SEMUA HAK AKSES agar tidak terkunci
            if ($roleName === 'owner' || $roleName === 'super_admin') {
                $role->syncPermissions(Permission::all());
            }
        }

        // Hubungkan data user yang sudah ada di database ke Role Spatie
        $users = \App\Models\User::all();
        foreach ($users as $user) {
            if ($user->role) {
                // Pastikan role-nya diset (assign) ke sistem Spatie
                $user->assignRole($user->role);
            }
        }
    }
}