<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Dia extends Model
{
    use HasFactory;

    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = ['nombre'];

    public function evento() {
        return $this->belongsTo(Evento::class);
    }

    public function horaFlags() {
        return $this->hasMany(HoraFlag::class);
    }

    // ordena las horaFlags asociadas a día por minutoDelDía, de menor a mayor;
    // las recorre sumando las flags asociadas a cada una y guardándo el número en cant_actual;
    // cuando cant_actual supera a la cantidad guardada en best, se hace un nuevo best:
        // se pone best["cantidad"] = cant_actual, en best["inicio"] el minutoDelDia de la hora actual
        // y en best["fin"] el minutoDelDía de la hora siguiente (esta hora existe porque si cant_actual
        // crece es porque llega a alguien, y por lo tanto hay una hora posterior en la que se va).
    // finalmente se devuelve best, con la duración del horario devuelto.
    public function marzullo(): array {
        // INICIO
        $cant_actual = 0;
        $best = ["cantidad" => 0, "inicio" => 0, "fin" => 0];
            // Ordenar horaFlags por minutoDelDia
        $horas = $this->horaFlags()->orderBy('minutoDelDia')->orderBy('flag')->get();
        // var_dump($horas);

        // ALGORITMO
        foreach ($horas as $i => $hora) {
            $cant_actual += $hora->flag;
            if ($cant_actual > $best["cantidad"] &&
                    ($horas[$i+1]->flag > 0 || $horas[$i+1]->minutoDelDia - $hora->minutoDelDia > 15)) {
                $best["cantidad"] = $cant_actual;
                $best["inicio"] = $hora->minutoDelDia;
                $best["fin"] = $horas[$i+1]->minutoDelDia;
            }
        }

        // RETURN
        $duracion = $best["fin"] - $best["inicio"];
        return [$best["cantidad"], $best["inicio"], $best["fin"], $duracion];
    }

}