<?php

namespace App\Http\Controllers\Parametres;

use App\Http\Controllers\Controller;
use App\Models\Structure;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;
use Spatie\Permission\Models\Role;

class StructureController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function index()
    {
        $structure = Structure::find(Auth::user()->structure_id);
        return view('parametres.structure.index', [
            'structure' => $structure,
            'users_by_role' => $structure->count_users_by_role(),
            'roles' => Structure::get_roles(Auth::user()->structure_id)
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        //
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        //
    }

    /**
     * Display the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function show($id)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function edit($id)
    {
        //
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(Request $request, $id)
    {
        if ($id == Auth::user()->structure_id) {
            // On récupère les rôles de la structure
            $roles = Role::where('name', 'LIKE', '%_'.$id.'%')->get();

            // On supprime les permissions associées aux roles
            switch ($request->type_permission) {
                case 'parametre':
                    $this->revokePermissions($roles, $request->type_permission, array('importer_parametre'));
                    break;
                case 'projet':
                    $this->revokePermissions($roles, $request->type_permission, array('edit_niveau_priorite'));
                    break;
                case 'paat':
                    $this->revokePermissions($roles, $request->type_permission, array('cloture_paat'));
                    break;
                case 'statut':
                    $this->revokeStatutsPermissions($roles);
                    break;
                case 'indicateurs':
                    $this->revokeIndicateursPermissions($roles);
                    break;
                case 'bibliotheque_projets':
                    $this->revokeBibliothequeProjetPermissions($roles);
                    break;
                default:
                    $this->revokePermissions($roles, $request->type_permission); // Pour les utilisateurs
                    break;
            }

            foreach ($request->except(['_token', '_method', 'type_permission']) as $key => $value) {
                $split = explode('-', $key);
                $role_id = array_shift($split);
                Role::find($role_id)->givePermissionTo(end($split));
            }

            return redirect()->route('structure.index')->with('success', 'Permissions mise à jour avec succès.');
        } else {
            abort(403);
        }
    }

    /**
     * Permet de mettre à jour le logo d'une structure
     * @param Request $request
     * @param int $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function changer_logo(Request $request, int $id)
    {
        $structure = Structure::find($id);
        if (isset($structure)) {
            if ($structure->id == Auth::user()->structure_id) {
                $request->validate([
                    'logo' => 'required|image|mimes:jpeg,png,jpg|max:2048'
                ]);

                $old_logo = $structure->logo;
                $new_logo = Storage::put('public/structures/' . $structure->id . '/logo', $request->file('logo'));
                $structure->update(['logo' => $new_logo]);
                Storage::delete($old_logo);

                return redirect()->route('structure.index')->with('success', 'Logo mis à jour avec succès.');
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\Response
     */
    public function destroy($id)
    {
        //
    }

    /**
     * Permet de retirer les permissions des rôles
     *
     * @param $roles
     * @param $type_permission
     * @param array $autres_permissions
     */
    private function revokePermissions($roles, $type_permission, $autres_permissions = array())
    {
        foreach ($roles as $r) {
            $r->revokePermissionTo('see_' . $type_permission);
            $r->revokePermissionTo('add_' . $type_permission);
            $r->revokePermissionTo('edit_' . $type_permission);
            $r->revokePermissionTo('delete_' . $type_permission);
            // Utilisé pour les permissions spéciales qui ne sont pas du see, add, edit et delete
            foreach ($autres_permissions as $ap) {
                $r->revokePermissionTo($ap);
            }
        }
    }

    /**
     * Permet de supprimer toutes les permissions liées aux statuts des projets pour chaque rôle
     * @param $roles
     */
    private function revokeStatutsPermissions($roles)
    {
        foreach ($roles as $r) {
            $r->revokePermissionTo('suspendre_acheteur');
            $r->revokePermissionTo('abandonner_acheteur');
            $r->revokePermissionTo('soumettre_acheteur');
            $r->revokePermissionTo('valider_responsable_achat');
            $r->revokePermissionTo('rejeter_responsable_achat');
            $r->revokePermissionTo('rejeter_chef_projet');
            $r->revokePermissionTo('valider_chef_projet');
            $r->revokePermissionTo('cloturer_chef_projet');
            $r->revokePermissionTo('avis_projet_controleur_gestion');
            $r->revokePermissionTo('rejeter_directeur_achat');
            $r->revokePermissionTo('valider_directeur_achat');
        }
    }

    /**
     * Permet de supprimer toutes les permissions liées à l'onglet éditions
     * @param $roles
     */
    private function revokeIndicateursPermissions($roles)
    {
        foreach ($roles as $r) {
            $r->revokePermissionTo('see_performance_economique');
            $r->revokePermissionTo('see_achats_mutualises');
            $r->revokePermissionTo('see_rse');
            $r->revokePermissionTo('see_gestion_paat');
            $r->revokePermissionTo('export_indicateurs');
        }
    }

    /**
     * Permet de supprimer toutes les permissions liées à l'onget bibliothèque projet
     * @param $roles
     */
    private function revokeBibliothequeProjetPermissions($roles)
    {
        foreach ($roles as $r) {
            $r->revokePermissionTo('see_bibliotheque_projets');
            $r->revokePermissionTo('add_bibliotheque_projets');
            $r->revokePermissionTo('creer_projet_from_bibliotheque_projets');
            $r->revokePermissionTo('delete_bibliotheque_projets');
        }
    }
}
