<?php

/*
 * -------------------------------------------------------------------------
 * SISTEMA: Nouderg Technology - Adobe Presentaciones
 * ARCHIVO: NouPantallaVideo.php
 * AUTOR: Leonardo Argueta
 * FECHA: 2026-05-25
 * DESCRIPCION: Modelo de los videos de la biblioteca. Incluye control
 *              de uso por pantalla y datos para preview en la biblioteca.
 * -------------------------------------------------------------------------
 */

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class NouPantallaVideo extends Model
{
    protected $table      = 'Nou_tbl_pant_videos';
    protected $primaryKey = 'id_video';

    protected $fillable = [
        'id_pantalla',
        'fecha_video',
        'prompt_usado',
        'operation_id',
        'ruta_archivo',
        'estado',
        'detalle_error',
        'en_uso_pantalla_id',
        'fuente',
        'titulo',
        'thumbnail_url',
    ];

    protected $casts = [
        'fecha_video' => 'date',
    ];

    /**
     * Pantalla propietaria del video (la que lo genero o descargo).
     */
    public function Nou_fun_pantalla(): BelongsTo
    {
        return $this->belongsTo(NouPantalla::class, 'id_pantalla', 'id_pantalla');
    }

    /**
     * Retorna todos los videos listos disponibles en la biblioteca.
     * Excluye los que estan en uso en una pantalla especifica.
     *
     * @param int|null $nou_var_excluir_pantalla_id  Pantalla a excluir del resultado.
     * @return \Illuminate\Database\Eloquent\Collection
     */
    public static function Nou_fun_disponibles(?int $nou_var_excluir_pantalla_id = null)
    {
        $nou_var_query = self::where('estado', 'listo');

        if ($nou_var_excluir_pantalla_id)
        {
            $nou_var_query->where(function ($q) use ($nou_var_excluir_pantalla_id)
            {
                $q->whereNull('en_uso_pantalla_id')
                  ->orWhere('en_uso_pantalla_id', $nou_var_excluir_pantalla_id);
            });
        }

        return $nou_var_query->get();
    }

    /**
     * Selecciona un video al azar que no este en uso en otras pantallas.
     * Si todos estan en uso, elige cualquiera al azar.
     *
     * @param int $nou_var_pantalla_id  ID de la pantalla que solicita el video.
     * @return self|null
     */
    public static function Nou_fun_aleatorio_para_pantalla(int $nou_var_pantalla_id): ?self
    {
        // Busca videos no usados por otras pantallas
        $nou_var_video = self::where('estado', 'listo')
            ->where(function ($q) use ($nou_var_pantalla_id)
            {
                $q->whereNull('en_uso_pantalla_id')
                  ->orWhere('en_uso_pantalla_id', $nou_var_pantalla_id);
            })
            ->inRandomOrder()
            ->first();

        // Si no hay disponibles, elige cualquiera al azar
        if (!$nou_var_video)
        {
            $nou_var_video = self::where('estado', 'listo')
                ->inRandomOrder()
                ->first();
        }

        return $nou_var_video;
    }

    /**
     * Marca este video como en uso por una pantalla especifica.
     *
     * @param int $nou_var_pantalla_id  ID de la pantalla que toma el video.
     */
    public function Nou_fun_marcar_en_uso(int $nou_var_pantalla_id): void
    {
        $this->update(['en_uso_pantalla_id' => $nou_var_pantalla_id]);
    }

    /**
     * Libera el video para que otras pantallas puedan usarlo.
     */
    public function Nou_fun_liberar(): void
    {
        $this->update(['en_uso_pantalla_id' => null]);
    }
}