<?php

namespace Database\Seeders;

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

class RolePermissionSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        /*******************************************************************
         ********************* CREATION des Permissions ********************
         *******************************************************************/

        // Définition des permissions concernant les paramètres
        $see_parametre = Permission::create(['name' => 'see_parametre']);
        $add_parametre = Permission::create(['name' => 'add_parametre']);
        $edit_parametre = Permission::create(['name' => 'edit_parametre']);
        $delete_parametre = Permission::create(['name' => 'delete_parametre']);

        // Définition des permissions concernant les utilisateurs
        $see_utilisateur = Permission::create(['name' => 'see_utilisateur']);
        $add_utilisateur = Permission::create(['name' => 'add_utilisateur']);
        $edit_utilisateur = Permission::create(['name' => 'edit_utilisateur']);
        $delete_utilisateur = Permission::create(['name' => 'delete_utilisateur']);

        // Définition des permissions concernant la structure
        $see_structure = Permission::create(['name' => 'see_structure']);
        $edit_structure = Permission::create(['name' => 'edit_structure']);

        // Définition des permissions concernant l'import de la nomenclature et des projets
        $import_parametre = Permission::create(['name' => 'importer_parametre']);

        // Définition des permissions concernant le paat
        $see_paat = Permission::create(['name' => 'see_paat']);
        $add_paat = Permission::create(['name' => 'add_paat']);
        $edit_paat = Permission::create(['name' => 'edit_paat']);
        $cloture_paat = Permission::create(['name' => 'cloture_paat']);
        $delete_paat = Permission::create(['name' => 'delete_paat']);

        // Définition des permissions concernant les projets
        $see_projet = Permission::create(['name' => 'see_projet']);
        $add_projet = Permission::create(['name' => 'add_projet']);
        $edit_projet = Permission::create(['name' => 'edit_projet']);
        $delete_projet = Permission::create(['name' => 'delete_projet']);
        $edit_niveau_priorite = Permission::create(['name' => 'edit_niveau_priorite']);

        // Définition des permissions concernant les statuts des projets
        // Acheteur
        $suspendre_acheteur = Permission::create(['name' => 'suspendre_acheteur']);
        $abandonner_acheteur = Permission::create(['name' => 'abandonner_acheteur']);
        $soumettre_acheteur = Permission::create(['name' => 'soumettre_acheteur']);
        // Responsable achat
        $valider_responsable_achat = Permission::create(['name' => 'valider_responsable_achat']);
        $rejeter_responsable_achat = Permission::create(['name' => 'rejeter_responsable_achat']);
        // Chef de projet achat
        $rejeter_chef_projet = Permission::create(['name' => 'rejeter_chef_projet']);
        $valider_chef_projet = Permission::create(['name' => 'valider_chef_projet']);
        $cloturer_chef_projet = Permission::create(['name' => 'cloturer_chef_projet']);
        // Contrôleur de gestion
        $avis_projet_controleur_gestion = Permission::create(['name' => 'avis_projet_controleur_gestion']);
        // Directeur achat
        $rejeter_directeur_achat = Permission::create(['name' => 'rejeter_directeur_achat']);
        $valider_directeur_achat = Permission::create(['name' => 'valider_directeur_achat']);

        // Définition des permissions concernant les indicateurs
        $see_performance_economique = Permission::create(['name' => 'see_performance_economique']);
        $see_achats_mutualises = Permission::create(['name' => 'see_achats_mutualises']);
        $see_rse = Permission::create(['name' => 'see_rse']);
        $see_gestion_paat = Permission::create(['name' => 'see_gestion_paat']);
        $export_indicateurs = Permission::create(['name' => 'export_indicateurs']);

        // Définition des permissions concernant la bibliothèque projets
        $see_bibliotheque_projets = Permission::create(['name' => 'see_bibliotheque_projets']);
        $add_bibliotheque_projets = Permission::create(['name' => 'add_bibliotheque_projets']);
        $delete_bibliotheque_projets = Permission::create(['name' => 'delete_bibliotheque_projets']);
        $creer_projet_from_bibliotheque_projets = Permission::create(['name' => 'creer_projet_from_bibliotheque_projets']);

        /*******************************************************************
         ******************** ASSIGNATION des Permissions ******************
         *******************************************************************/

        // Création du role de super administrateur -> Ici on mets structure_id à 0 car le role porte sur toute l'application
        $super_administrateur = array(
            Role::create(['name' => 'super_administrateur_1']),
            Role::create(['name' => 'super_administrateur_2'])
        );
        $permissions = Permission::all();
        foreach ($super_administrateur as $a){
            $a->givePermissionTo($permissions);
        }

        // Permissions pour l'administrateur de structure
        $administrateurs_structures = array(
            Role::create(['name' => 'administrateur_structure_2']),
            Role::create(['name' => 'administrateur_structure_3'])
        );
        foreach ($administrateurs_structures as $a)
        {
            $a->givePermissionTo($see_parametre);
            $a->givePermissionTo($add_parametre);
            $a->givePermissionTo($edit_parametre);
            $a->givePermissionTo($delete_parametre);

            $a->givePermissionTo($see_utilisateur);
            $a->givePermissionTo($add_utilisateur);
            $a->givePermissionTo($edit_utilisateur);
            $a->givePermissionTo($delete_utilisateur);

            $a->givePermissionTo($see_structure);
            $a->givePermissionTo($edit_structure);

            $a->givePermissionTo($import_parametre);

            $a->givePermissionTo($see_performance_economique);
            $a->givePermissionTo($see_achats_mutualises);
            $a->givePermissionTo($see_rse);
            $a->givePermissionTo($see_gestion_paat);
            $a->givePermissionTo($export_indicateurs);

            $a->givePermissionTo($see_bibliotheque_projets);
            $a->givePermissionTo($add_bibliotheque_projets);
            $a->givePermissionTo($delete_bibliotheque_projets);
            $a->givePermissionTo($creer_projet_from_bibliotheque_projets);
        }

        // Permissions pour l'acheteur
        $acheteurs = array(
            Role::create(['name' => 'acheteur_2']),
            Role::create(['name' => 'acheteur_3'])
        );
        foreach ($acheteurs as $a)
        {
            $a->givePermissionTo($see_projet);
            $a->givePermissionTo($add_projet);
            $a->givePermissionTo($edit_projet);
            $a->givePermissionTo($suspendre_acheteur);
            $a->givePermissionTo($abandonner_acheteur);
            $a->givePermissionTo($soumettre_acheteur);
        }

        // Permissions pour le contrôleur de gestion
        $controleurs_gestions = array(
            Role::create(['name' => 'controleur_gestion_2']),
            Role::create(['name' => 'controleur_gestion_3'])
        );
        foreach($controleurs_gestions as $c)
        {
            $c->givePermissionTo($see_projet);
            $c->givePermissionTo($edit_projet);
            $c->givePermissionTo($avis_projet_controleur_gestion);
        }

        // Permissions pour le responsable achat
        $responsables_achats = array(
            Role::create(['name' => 'responsable_achat_2']),
            Role::create(['name' => 'responsable_achat_3'])
        );
        foreach($responsables_achats as $r)
        {
            $r->givePermissionTo($see_projet);
            $r->givePermissionTo($add_projet);
            $r->givePermissionTo($edit_projet);
            $r->givePermissionTo($rejeter_responsable_achat);
            $r->givePermissionTo($valider_responsable_achat);
        }

        // Permissions pour le chef de projet
        $chefs_projets = array(
            Role::create(['name' => 'chef_projet_2']),
            Role::create(['name' => 'chef_projet_3'])
        );
        foreach($chefs_projets as $c)
        {
            $c->givePermissionTo($see_paat);
            $c->givePermissionTo($add_paat);
            $c->givePermissionTo($edit_paat);
            $c->givePermissionTo($delete_paat);
            $c->givePermissionTo($see_projet);
            $c->givePermissionTo($add_projet);
            $c->givePermissionTo($edit_projet);
            $c->givePermissionTo($delete_projet);
            $c->givePermissionTo($edit_niveau_priorite);
            $c->givePermissionTo($rejeter_chef_projet);
            $c->givePermissionTo($valider_chef_projet);
            $c->givePermissionTo($cloturer_chef_projet);
        }

        // Permissions pour le directeur achat
        $directeurs_achats = array(
            Role::create(['name' => 'directeur_achat_2']),
            Role::create(['name' => 'directeur_achat_3'])
        );
        foreach($directeurs_achats as $d)
        {
            $d->givePermissionTo($see_paat);
            $d->givePermissionTo($cloture_paat);
            $d->givePermissionTo($see_projet);
            $d->givePermissionTo($edit_projet);
            $d->givePermissionTo($rejeter_directeur_achat);
            $d->givePermissionTo($valider_directeur_achat);
        }

        // Permissions pour l'equipe projet
        $equipes_projets = array(
            Role::create(['name' => 'equipe_projet_2']),
            Role::create(['name' => 'equipe_projet_3'])
        );
        foreach($equipes_projets as $e)
        {
            $e->givePermissionTo($see_projet);
        }

        // Permissions pour l'expert
        $experts = array(
            Role::create(['name' => 'expert_2']),
            Role::create(['name' => 'expert_3'])
        );
        foreach($experts as $e)
        {
            $e->givePermissionTo($see_projet);
        }

        // Permissions pour le directeur
        $directeurs = array(
            Role::create(['name' => 'directeur_2']),
            Role::create(['name' => 'directeur_3'])
        );
        foreach($directeurs as $d)
        {
            $d->givePermissionTo($see_projet);

            $d->givePermissionTo($see_performance_economique);
            $d->givePermissionTo($see_achats_mutualises);
            $d->givePermissionTo($see_rse);
            $d->givePermissionTo($see_gestion_paat);
            $d->givePermissionTo($export_indicateurs);
        }

        // Permissions pour le responsable ARS
        Role::create(['name' => 'responsable_performance_ars_2']);
        Role::create(['name' => 'responsable_performance_ars_3']);
    }
}
