<?php

namespace App\Http\Controllers;

use App\Models\Dia;
use App\Models\Evento;
use App\Models\HoraFlag;
use App\Models\Utils;
use Dotenv\Validator;
use Illuminate\Http\Request;
use mysql_xdevapi\Exception;

class EventoController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        //
    }

    /**
     * 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\RedirectResponse
     */
    public function store(Request $request)
    {
        $request->validate([
            'nombre' => 'required',
        ]);
        $evento = new Evento();
        $evento->nombre = $request->input("nombre");
        $evento->save();
        return redirect()->route("edit", ['evento' => $evento]);
    }

    /**
     * Display the specified resource.
     *
     * @param  \App\Models\Evento  $evento
     * @return \Illuminate\Http\Response
     */
    public function show(Evento $evento)
    {
        // evento->coordinar devuelve los tres mejores marzullos de los días que tiene asociados
        // dia->marzullo devuelve array de
            // [dia::string, cantidad::integer, inicio::integer, fin::integer, duracion::integer
                // inicioLindo::string, finLindo::string, duracionLinda::string]
        $marzullos = $evento->coordinar();
        return view("resultado", ['marzullos' => $marzullos, 'evento' => $evento]);
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Models\Evento  $evento
     * @return \Illuminate\Http\Response
     */
    public function edit(Evento $evento)
    {
        return view("edit", ['evento' => $evento]);
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Models\Evento  $evento
     * @return \Illuminate\Http\RedirectResponse
     */
    public function update(Request $request, Evento $evento) {

        // Validación.
        request()->validate([
            'dia' => 'array',
            'dia.*' => 'required|string|max:100',
            'salida' => 'array',
            'llegada.*' => 'required|date_format:H:i',
            'llegada' => 'array',
            'salida.*' => 'required|date_format:H:i|after:llegada.*'
        ],[
            'salida.*.after' => 'La hora de llegada debe ser anterior a la de salida.'
            ]);

        // Adición de días y horas.
        foreach ($request->input('dia') as $i => $dia) {

            // Busqueda en la lista de días del evento, y adición en su defecto.
            $diaNombre = strtolower(trim($dia)); // ¿HACER FUNCIÓN PARA NORMALIZAR NOMBRES?
            $arrayAux = $evento->dias()->where('nombre',$diaNombre)->get();
            $diaID = null;
            if ($arrayAux->count() == 0) {
                $nuevo = new Dia(['nombre' => $diaNombre]);
                $nuevo->evento_id = $evento->id;
                $nuevo->save();
                $diaID = $nuevo->id;
            } else {
                $diaID = $arrayAux[0]->id;
            }

            // Creación de hora_flags ingresados para cada día.
            $llegadaDia = new HoraFlag([
                'dia_id' => $diaID,
                'minutoDelDia' => Utils::formatMinutos($request->input('llegada')[$i]),
                'flag' => 1
            ]);
            $salidaDia = new HoraFlag([
                'dia_id' => $diaID,
                'minutoDelDia' => Utils::formatMinutos($request->input('salida')[$i]),
                'flag' => -1
            ]);

            // Adición de hora_flags ingresados para cada día.
            $llegadaDia->save();
            $salidaDia->save();
        }

        return redirect()->route("show", ['evento' => $evento]);
    }

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

    public function prueba()
    {
        return view("prueba");
    }
}