<?php

namespace App\Models;

use CodeIgniter\Model;

class FuncionModel extends Model
{
    protected $table            = 'funcion';
    protected $primaryKey       = 'id_funcion';
    protected $useAutoIncrement = true;
    protected $returnType       = 'App\Entities\Funcion';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = [
        'id_pelicula',
        'id_sala',
        'fecha',
        'hora_inicio',
        'hora_fin',
        'precio_base',
        'estado'
    ];

    protected $validationRules = [
        'id_pelicula' => 'required|integer',
        'id_sala'     => 'required|integer',
        'fecha'       => 'required|valid_date[Y-m-d]',
        'hora_inicio' => 'required',
        'hora_fin'    => 'required',
        'precio_base' => 'required|numeric|greater_than[0]',
        'estado'      => 'required|in_list[programada,en_curso,finalizada,cancelada]',
    ];

    /**
     * Obtiene las funciones asociando película, sala y local.
     */
    public function getFuncionesConDetalles($terminoBusqueda = null, $filtros = [])
    {
        $builder = $this->select('funcion.*, pelicula.titulo as pelicula_titulo, pelicula.duracion_min as pelicula_duracion, pelicula.poster_url as pelicula_poster, sala.nombre as sala_nombre, sala.tipo as sala_tipo, local.nombre as local_nombre, local.id_local')
            ->join('pelicula', 'pelicula.id_pelicula = funcion.id_pelicula')
            ->join('sala', 'sala.id_sala = funcion.id_sala')
            ->join('local', 'local.id_local = sala.id_local');

        if (!empty($terminoBusqueda)) {
            $builder->groupStart()
                ->like('pelicula.titulo', $terminoBusqueda)
                ->orLike('sala.nombre', $terminoBusqueda)
                ->orLike('local.nombre', $terminoBusqueda)
                ->groupEnd();
        }

        if (!empty($filtros['id_pelicula'])) {
            $builder->where('funcion.id_pelicula', $filtros['id_pelicula']);
        }

        if (!empty($filtros['id_local'])) {
            $builder->where('local.id_local', $filtros['id_local']);
        }

        if (!empty($filtros['id_sala'])) {
            $builder->where('funcion.id_sala', $filtros['id_sala']);
        }

        if (!empty($filtros['fecha'])) {
            $builder->where('funcion.fecha', $filtros['fecha']);
        }

        return $builder->orderBy('funcion.fecha', 'DESC')
                       ->orderBy('funcion.hora_inicio', 'ASC');
    }
}
