<?php

namespace Database\Seeders;

use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;
use Spatie\Permission\Models\Role;
use Spatie\Permission\Models\Permission;

class RolePermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run(): void
    {
        // Réinitialiser le cache des permissions
        app()[\Spatie\Permission\PermissionRegistrar::class]->forgetCachedPermissions();

        // Créer toutes les permissions
        $permissions = [
            // Départements
            'departments.view',
            'departments.create',
            'departments.update',
            'departments.delete',

            // Fournisseurs
            'suppliers.view',
            'suppliers.create',
            'suppliers.update',
            'suppliers.delete',

            // Catégories
            'categories.view',
            'categories.create',
            'categories.update',
            'categories.delete',

            // Produits
            'products.view',
            'products.create',
            'products.update',
            'products.delete',

            // Stocks
            'stocks.view',
            'stocks.create',
            'stocks.update',
            'stocks.delete',

            // Mouvements de stock
            'movement_stocks.view',
            'movement_stocks.create',
            'movement_stocks.update',
            'movement_stocks.delete',

            // Demandes
            'requests.view',
            'requests.create',
            'requests.update',
            'requests.delete',
            'requests.approve',
            'requests.reject',

            // Détails de demandes
            'request_details.view',
            'request_details.create',
            'request_details.update',
            'request_details.delete',

            // Équipements
            'equipment.view',
            'equipment.create',
            'equipment.update',
            'equipment.delete',

            // Unités de mesure
            'units.view',
            'units.create',
            'units.update',
            'units.delete',

            // Utilisateurs (pour Super Admin)
            'users.view',
            'users.create',
            'users.update',
            'users.delete',
        ];

        // Créer les permissions
        foreach ($permissions as $permission) {
            Permission::firstOrCreate(
                ['name' => $permission, 'guard_name' => 'web']
            );
        }

        // Créer les rôles
        $superAdmin = Role::firstOrCreate(['name' => 'Super Administrateur', 'guard_name' => 'web']);
        $admin = Role::firstOrCreate(['name' => 'Administrateur', 'guard_name' => 'web']);
        $magasinier = Role::firstOrCreate(['name' => 'Magasinier', 'guard_name' => 'web']);

        // Super Administrateur - Toutes les permissions
        $superAdmin->givePermissionTo(Permission::all());

        // Administrateur - Peut voir, supprimer, approuver/rejeter les demandes
        // Mais ne peut pas créer ni modifier
        $adminPermissions = [
            // View toutes les ressources
            'departments.view',
            'suppliers.view',
            'categories.view',
            'products.view',
            'stocks.view',
            'movement_stocks.view',
            'requests.view',
            'request_details.view',
            'equipment.view',
            'units.view',
            'users.view',

            // Delete toutes les ressources
            'departments.delete',
            'suppliers.delete',
            'categories.delete',
            'products.delete',
            'stocks.delete',
            'movement_stocks.delete',
            'requests.delete',
            'request_details.delete',
            'equipment.delete',
            'units.delete',
            'users.delete',

            // Approbation et rejet des demandes
            'requests.approve',
            'requests.reject',
        ];

        $admin->givePermissionTo($adminPermissions);

        // Magasinier - Peut créer, modifier ses propres enregistrements, voir les demandes
        // Mais ne peut pas approuver/rejeter les demandes
        $magasinierPermissions = [
            // View toutes les ressources
            'departments.view',
            'suppliers.view',
            'categories.view',
            'products.view',
            'stocks.view',
            'movement_stocks.view',
            'requests.view',
            'request_details.view',
            'equipment.view',
            'units.view',

            // Create toutes les ressources
            'departments.create',
            'suppliers.create',
            'categories.create',
            'products.create',
            'stocks.create',
            'movement_stocks.create',
            'requests.create',
            'request_details.create',
            'equipment.create',
            'units.create',

            // Update toutes les ressources (sera géré par les policies pour ses propres enregistrements)
            'departments.update',
            'suppliers.update',
            'categories.update',
            'products.update',
            'stocks.update',
            'movement_stocks.update',
            'requests.update',
            'request_details.update',
            'equipment.update',
            'units.update',

            // Delete ses propres enregistrements (sera géré par les policies)
            'departments.delete',
            'suppliers.delete',
            'categories.delete',
            'products.delete',
            'stocks.delete',
            'movement_stocks.delete',
            'requests.delete',
            'request_details.delete',
            'equipment.delete',
            'units.delete',
        ];

        $magasinier->givePermissionTo($magasinierPermissions);

        $this->command->info('Rôles et permissions créés avec succès !');
        $this->command->info('Super Administrateur: Toutes les permissions');
        $this->command->info('Administrateur: View, Delete, Approve/Reject');
        $this->command->info('Magasinier: View, Create, Update, Delete (ses propres enregistrements)');
    }
}

