<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Permission;
use Spatie\Permission\Models\Role;

class RolePermissionSeeder extends Seeder
{
    public function run(): void
    {
        // Reset cached roles and permissions
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // Create permissions - matching the permission matrix in RoleController
        $permissionMatrix = [
            'dashboard' => 'Dashboard',
            'users' => 'Users',
            'roles' => 'Roles',
            'products' => 'Products',
            'categories' => 'Categories',
            'brands' => 'Brands',
            'attributes' => 'Attributes',
            'orders' => 'Orders',
            'tickets' => 'Tickets',
            'coupons' => 'Coupons',
            'reports' => 'Reports',
            'reviews' => 'Reviews',
            'banners' => 'Banners',
            'announcements' => 'Announcements',
            'shipping-methods' => 'Shipping Methods',
            'units' => 'Units',
            'taxes' => 'Taxes',
            'carriers' => 'Carriers',
            'settings' => 'Settings',
        ];

        $abilities = ['view', 'create', 'update', 'delete'];

        foreach ($permissionMatrix as $module => $label) {
            foreach ($abilities as $ability) {
                Permission::firstOrCreate(
                    ['name' => "{$module}.{$ability}", 'guard_name' => 'web'],
                    ['guard_name' => 'web']
                );
            }
        }

        $dayLedgerPermissions = [
            'reports.day-ledger.view',
            'reports.day-ledger.manage',
            'reports.day-ledger.close',
            'reports.day-ledger.reopen',
        ];
        foreach ($dayLedgerPermissions as $permission) {
            Permission::firstOrCreate(
                ['name' => $permission, 'guard_name' => 'web'],
                ['guard_name' => 'web']
            );
        }

        // Create roles
        $adminRole = Role::firstOrCreate(['name' => 'admin'], ['guard_name' => 'web']);
        $staffRole = Role::firstOrCreate(['name' => 'staff'], ['guard_name' => 'web']);
        $customerRole = Role::firstOrCreate(['name' => 'customer'], ['guard_name' => 'web']);
        $superAdminRole = Role::firstOrCreate(['name' => 'super_admin'], ['guard_name' => 'web']);

        // Assign all permissions to admin
        $adminRole->givePermissionTo(Permission::all());
        $superAdminRole->givePermissionTo(Permission::all());

        // Assign limited permissions to staff
        $staffRole->givePermissionTo([
            'products.view',
            'products.update',
            'categories.view',
            'orders.view',
            'orders.update',
            'tickets.view',
            'tickets.assign',
            'tickets.reply',
            'tickets.update',
            'users.view',
        ]);

        // Customer role has no admin permissions
    }
}
