<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RolesAndPermissionsSeeder extends Seeder
{
    public function run(): void
    {
        // Reset cached roles and permissions
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // create permissions
        $permissions = [
            'view products',
            'create products',
            'edit products',
            'delete products',
            'view categories',
            'create categories',
            'edit categories',
            'delete categories',
            'view orders',
            'update orders',
            'view users',
            'edit users',
            'view staff',        // Permission to view staff team
            'view reports',
            'manage coupons',
            'manage shipping',
            'manage reviews',     // Permission to manage product reviews
            'pos_access',        // Permission to access POS system
            'reports.day-ledger.view',
            'reports.day-ledger.manage',
            'reports.day-ledger.close',
            'reports.day-ledger.reopen',
            'tickets.view',
            'tickets.assign',
            'tickets.reply',
            'tickets.update',
            // Multi-store / location ops
            'locations.view',
            'locations.manage',
            'inventory.balances.view',
            'transfers.view',
            'transfers.manage',
            'transfers.approve',
            'transfers.ship',
            'transfers.receive',
            'suppliers.manage',
            'purchase-orders.view',
            'purchase-orders.manage',
            'purchase-orders.receive',
            'allocation-rules.manage',
            'reports.location-ops',
        ];

        foreach ($permissions as $permission) {
            Permission::firstOrCreate(['name' => $permission, 'guard_name' => 'web']);
        }

        // create roles and assign permissions
        $adminRole = Role::firstOrCreate(['name' => 'admin', 'guard_name' => 'web']);
        $adminRole->syncPermissions(Permission::all());

        $superAdminRole = Role::firstOrCreate(['name' => 'super_admin', 'guard_name' => 'web']);
        $superAdminRole->syncPermissions(Permission::all());

        $staffRole = Role::firstOrCreate(['name' => 'staff', 'guard_name' => 'web']);
        $staffRole->syncPermissions([
            'view products',
            'edit products',
            'view categories',
            'view orders',
            'update orders',
            'view users',        // Staff can view registered users
            // 'view staff',     // Staff cannot view other staff (only admins can)
            'view reports',
            'manage reviews',    // Staff can manage product reviews
            'pos_access',        // Staff can access POS system
            'reports.day-ledger.view',
            'tickets.view',
            'tickets.assign',
            'tickets.reply',
            'tickets.update',
            // Minimal multi-store ops for store staff
            'inventory.balances.view',
            'transfers.view',
            'transfers.manage',
            'transfers.receive',
            'purchase-orders.view',
            'purchase-orders.receive',
            'reports.location-ops',
        ]);

        $this->command->info('Roles and permissions seeded successfully!');
    }
}
