<?php
// Incluye el archivo de conexión y los modelos necesarios
include_once '../services/pdo_connection.php';
include_once '../models/model_historial_agenda.php';

class HistorialAgendaController {

    private $conn;

    public function __construct() {
        $database = new Database();
        $this->conn = $database->getConnection();
    }

    public function obtenerHistorialAgendaConDatos(
        string $nombre_o_telefono = '',
        string $fecha = '',
        string $estado = '',
        string $mes = '',
        string $anio = '',
        string $orden = ''
    ) {
        $db = $this->conn;

        // Normaliza lo que escribe el usuario (sólo dígitos) para comparar con teléfono “limpio”
        $qDigits = preg_replace('/\D+/', '', (string)$nombre_o_telefono);
        // Expresión SQL para “limpiar” el teléfono en DB
        $sqlPhoneNorm = "REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(telefono,'-',''),' ',''),'(',''),')',''),'.',''),'+','')";

        $sql = "SELECT id_agenda, nombre_cliente, telefono, direccion_texto,
                       fecha_evento, hora_evento, anticipo, falta_por_pagar, estado, notas
                FROM agenda
                WHERE 1=1";
        $params = [];

        if ($nombre_o_telefono !== '') {
            // Busca por nombre o teléfono tal cual, y además por teléfono normalizado si el usuario puso dígitos
            $sql .= " AND (nombre_cliente LIKE :q OR telefono LIKE :q";
            if ($qDigits !== '') {
                $sql .= " OR {$sqlPhoneNorm} LIKE :qd";
                $params[':qd'] = "%{$qDigits}%";
            }
            $sql .= ")";
            $params[':q'] = "%{$nombre_o_telefono}%";
        }

        if ($fecha !== '') {
            $sql .= " AND DATE(fecha_evento) = :f";
            $params[':f'] = $fecha;
        }
        if ($estado !== '') {
            $sql .= " AND estado = :e";
            $params[':e'] = $estado;
        }
        if ($mes !== '') {
            $sql .= " AND MONTH(fecha_evento) = :m";
            $params[':m'] = (int)$mes; // admite "01".."12"
        }
        if ($anio !== '') {
            $sql .= " AND YEAR(fecha_evento) = :y";
            $params[':y'] = (int)$anio;
        }

        // Ordenamiento (precio total = anticipo + falta_por_pagar)
        switch ($orden) {
            case 'precio_desc':
                $sql .= " ORDER BY (COALESCE(anticipo,0)+COALESCE(falta_por_pagar,0)) DESC, fecha_evento DESC";
                break;
            case 'precio_asc':
                $sql .= " ORDER BY (COALESCE(anticipo,0)+COALESCE(falta_por_pagar,0)) ASC, fecha_evento DESC";
                break;
            default:
                $sql .= " ORDER BY fecha_evento DESC";
        }

        $st = $db->prepare($sql);
        foreach ($params as $k => $v) $st->bindValue($k, $v);
        $st->execute();

        return $st->fetchAll(PDO::FETCH_ASSOC);
    }

    public function obtenerAniosAgendaDisponibles(): array {
        $db = $this->conn;
        $st = $db->query("SELECT DISTINCT YEAR(fecha_evento) AS anio
                          FROM agenda
                          ORDER BY anio DESC");
        $rows = $st->fetchAll(PDO::FETCH_ASSOC);
        return array_map(fn($r) => (int)$r['anio'], $rows);
    }

    // Este método ya no es necesario si usas el método de abajo,
    // pero puedes mantenerlo si lo necesitas para otras funcionalidades.
    public function actualizarEstado($id_agenda, $estado, $fecha) {
        $historial_agenda = new HistorialAgenda();
        return $historial_agenda->actualizarEstado($this->conn, $id_agenda, $estado, $fecha);
    }

    // Endpoint: actualiza estado/fecha de forma independiente
    public function actualizarEstadoIndependiente($id_agenda, $estado = null, $fecha = null) {
        // En lugar de HistorialAgenda, usa la clase Agenda
        $agenda = new Agenda();
        return $agenda->actualizarIndependiente($this->conn, $id_agenda, $estado, $fecha);
    }
}

?>