<?php

namespace App\Http\Controllers\Parametres;

use App\Http\Controllers\Parametres\Base\ParametreBaseController;
use App\Models\Alerte;
use App\Models\Structure;
use App\Models\User;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use APPLICATION;

class AlerteController extends ParametreBaseController
{
    public function __construct()
    {
        parent::__construct('alertes');
    }

    /**
     * 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()
    {
        return view('parametres.alertes.index', [
            'alertes' => Alerte::select('alertes.*')
                                ->join('users', 'users.id', '=', 'alertes.user_id')
                                ->where('users.structure_id', Auth::user()->structure_id)->paginate(APPLICATION::ITEMS_PER_PAGE),
            'structure' => Structure::find(Auth::user()->structure_id)
        ]);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function create()
    {
        return view('parametres.alertes.create', [
            'users' => User::where('structure_id', Auth::user()->structure_id)->get(),
            'roles' => Structure::get_roles(Auth::user()->structure_id)
        ]);
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\RedirectResponse
     */
    public function store(Request $request)
    {
        $request->validate([
            'role' => 'required',
            'user' => 'required',
            'critere' => 'required',
            'formule' => 'required',
            'indicateur' => 'required_without:est_valeur',
            'indicateur_critere' => 'required_with:est_valeur'
        ]);

        $user_values = explode('_', $request->user);

        $request->has('est_valeur') ?
            Alerte::firstOrCreate(array_merge(
                $request->except(['_token', 'role', 'user', 'est_valeur', 'indicateur']),
                [
                    'est_valeur' => false,
                    'indicateur' => null,
                    'user_id' => $user_values[array_key_last($user_values)]
                ]
            ))
            : Alerte::firstOrCreate(array_merge(
                $request->except(['_token', 'role', 'user', 'est_valeur', 'indicateur_critere']),
                [
                    'est_valeur' => true,
                    'indicateur_critere' => null,
                    'user_id' => $user_values[array_key_last($user_values)]
                ]
            ));
        return redirect()->route('alertes.index')->with('success', 'Alerte ajoutée avec succès.');
    }

    /**
     * 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\Contracts\Foundation\Application|\Illuminate\Contracts\View\Factory|\Illuminate\Contracts\View\View|\Illuminate\Http\Response
     */
    public function edit(int $id)
    {
        $alerte = Alerte::find($id);
        if (isset($alerte)) {
            if ($this->checkAccesStructure($alerte->user->structure_id)) {
                return view('parametres.alertes.edit', [
                    'alerte' => $alerte
                ]);
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  int  $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(Request $request, int $id)
    {
        $request->validate([
            'critere' => 'required',
            'formule' => 'required',
            'indicateur' => 'required_without:est_valeur',
            'indicateur_critere' => 'required_with:est_valeur'
        ]);

        $alerte = Alerte::find($id);
        if ($alerte) {
            if ($this->checkAccesStructure($alerte->user->structure_id)) {
                $request->has('est_valeur') ?
                    $alerte->update(array_merge(
                        $request->except('_token', '_method', 'role', 'user', 'est_valeur', 'indicateur'),
                        [
                            'est_valeur' => false,
                            'indicateur' => null
                        ]
                    ))
                    : $alerte->update(array_merge(
                        $request->except('_token', '_method', 'role', 'user', 'est_valeur', 'indicateur_critere'),
                        [
                            'est_valeur' => true,
                            'indicateur_critere' => null
                        ]
                    ));

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

    /**
     * Remove the specified resource from storage.
     *
     * @param  int  $id
     * @return \Illuminate\Http\RedirectResponse
     */
    public function destroy(int $id)
    {
        $alerte = Alerte::find($id);
        if ($alerte) {
            if ($this->checkAccesStructure($alerte->user->structure_id)) {
                $alerte->delete();
                return redirect()->route('alertes.index')->with('success', 'Alerte supprimée avec succès.');
            } else {
                abort(403);
            }
        } else {
            abort(404);
        }
    }
}
