<?php

namespace App\Http\Controllers\Parametres;

use App\Http\Controllers\Parametres\Base\ParametreBaseController;
use App\Http\Requests\Parametres\StoreRequest;
use App\Http\Requests\Parametres\UpdateRequest;
use App\Models\Categorie;
use App\Models\Domaine;
use App\Models\Famille;
use App\Models\Segment;
use APPLICATION;

class SegmentController extends ParametreBaseController
{
    public function __construct()
    {
        parent::__construct('segments', 'Categorie');
    }

    /**
     * Display a listing of the resource.
     *
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function index(int $famille_id, int $domaine_id, int $categorie_id)
    {
        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                return view('parametres.segments.index', [
                    'parametres' => Segment::where('categorie_id', $categorie_id)->paginate(APPLICATION::ITEMS_PER_PAGE),
                    'parent' => $categorie,
                    'parametres_url' => array($famille_id, $domaine_id, $categorie_id),
                    'route' => $this->_route,
                    'has_enfant' => false
                ]);
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Show the form for creating a new resource.
     *
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function create(int $famille_id, int $domaine_id, int $categorie_id)
    {
        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                return view('parametres.segments.create', [
                    'parent' => $categorie,
                    'type_parent' => $this->_type_parent,
                    'route' => $this->_route,
                    'store_parametre' => array($famille_id, $domaine_id, $categorie_id)
                ]);
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param StoreRequest $request
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(StoreRequest $request, int $famille_id, int $domaine_id, int $categorie_id)
    {
        $validated = $request->validated();

        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                Segment::firstOrCreate(array_merge(
                    $validated,
                    ['categorie_id' => $categorie_id]
                ));
                return redirect()->route('segments.index', array($famille_id, $domaine_id, $categorie_id))->with('success', 'Segment ajouté avec succès.');
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Segment  $segment
     * @return \Illuminate\Http\Response
     */
    public function show(Segment $segment)
    {
        //
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @param int $id
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function edit(int $famille_id, int $domaine_id, int $categorie_id, int $id)
    {
        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        $segment = Segment::find($id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)
            && isset($segment) && $segment->categorie_id == $categorie_id) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                return view('parametres.segments.edit', [
                    'parametre' => $segment,
                    'parent' => $categorie,
                    'type_parent' => $this->_type_parent,
                    'route' => $this->_route,
                    'update_parametre' => array($famille_id, $domaine_id, $categorie_id)
                ]);
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param UpdateRequest $request
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @param int $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(UpdateRequest $request, int $famille_id, int $domaine_id, int $categorie_id, int $id)
    {
        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        $segment = Segment::find($id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)
            && isset($segment) && $segment->categorie_id == $categorie_id) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                $validated = $request->validated();
                $segment->update($validated);
                return redirect()->route('segments.index', array($famille_id, $domaine_id, $categorie_id))->with('success', 'Segment mis à jour avec succès.');
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Remove the specified resource from storage.
     *
     * @param int $famille_id
     * @param int $domaine_id
     * @param int $categorie_id
     * @param int $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(int $famille_id, int $domaine_id, int $categorie_id, int $id)
    {
        $famille = Famille::find($famille_id);
        $domaine = Domaine::find($domaine_id);
        $categorie = Categorie::find($categorie_id);
        $segment = Segment::find($id);
        if ($this->checkHierarchieParent($famille, $domaine, $categorie)
            && isset($segment) && $segment->categorie_id == $categorie_id) {
            if ($this->checkAccesStructure($famille->structure_id)) {
                if ($segment->projets->count() > 0) {
                    return redirect()->back()->withErrors('Impossible de supprimer le segment car il est utilisé dans des projets.');
                }
                $segment->delete();
                return redirect()->route('segments.index', array($famille_id, $domaine_id, $categorie_id))->with('success', 'Segment supprimé avec succès.');
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Permet de vérifier la hiérarchie de tous les parents du Segment
     * @param Famille $famille
     * @param Domaine $domaine
     * @param Categorie $categorie
     * @return bool
     */
    private function checkHierarchieParent(Famille $famille, Domaine $domaine, Categorie $categorie)
    {
        return isset($famille)
            && isset($domaine)
            && isset($categorie)
            && $domaine->famille_id == $famille->id
            && $categorie->domaine_id == $domaine->id;
    }
}
