<?php

namespace App\Models;

use CodeIgniter\Model;

class PromocionModel extends Model
{
    protected $table            = 'promocion';
    protected $primaryKey       = 'id_promocion';
    protected $useAutoIncrement = true;
    protected $returnType       = 'App\Entities\Promocion';
    protected $useSoftDeletes   = false;
    protected $protectFields    = true;
    protected $allowedFields    = [
        'nombre',
        'descripcion',
        'imagen',
        'tipo',
        'tipo_descuento',
        'valor_descuento',
        'cantidad_minima',
        'aplica_tipo_sala',
        'fecha_inicio',
        'fecha_fin',
        'stock',
        'activo',
    ];

    protected $validationRules = [
        'nombre'           => 'required|min_length[2]|max_length[150]',
        'descripcion'      => 'permit_empty',
        'imagen'           => 'permit_empty|max_length[255]',
        'tipo'             => 'required|in_list[ENTRADA,COMBO,PRODUCTO,GENERAL]',
        'tipo_descuento'   => 'required|in_list[PORCENTAJE,PRECIO_FIJO]',
        'valor_descuento'  => 'required|numeric|greater_than_equal_to[0]',
        'cantidad_minima'  => 'permit_empty|numeric|greater_than_equal_to[1]',
        'aplica_tipo_sala' => 'permit_empty|in_list[2D,3D,IMAX,4DX]',
        'fecha_inicio'     => 'required|valid_date[Y-m-d]',
        'fecha_fin'        => 'required|valid_date[Y-m-d]',
        'stock'            => 'permit_empty|numeric|greater_than_equal_to[0]',
        'activo'           => 'permit_empty|in_list[0,1]',
    ];

    /**
     * Promociones vigentes (activo=1 y hoy dentro de fecha_inicio/fecha_fin) para el público.
     */
    public function getVigentes(): array
    {
        $hoy = date('Y-m-d');

        return $this->where('activo', 1)
                    ->where('fecha_inicio <=', $hoy)
                    ->where('fecha_fin >=', $hoy)
                    ->groupStart()
                        ->where('stock', null)
                        ->orWhere('stock >', 0)
                    ->groupEnd()
                    ->orderBy('fecha_inicio', 'DESC')
                    ->findAll();
    }
}
