<?php
include_once __DIR__ . '/../services/pdo_connection.php';
include_once __DIR__ . '/../models/model_historial.php';
include_once __DIR__ . '/../models/model_pedido.php';

class HistorialController
{
    private $conn;

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

    public function obtenerHistorialConPedidos(
        $busqueda = '',
        $estadoEntrega = '',
        $estadoPago = '',
        $orden = '',
        $mes = '',
        $anio = ''
    ) {
        $busquedaDigits = preg_replace('/\D+/', '', (string)$busqueda);
        $sqlPhoneNorm = "REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(p.telefono,'-',''),' ',''),'(',''),')',''),'.',''),'+','')";

        $sql = "SELECT p.id_pedido, p.nombre_cliente, p.telefono, p.direccion_texto, p.referencia,
                       p.monto_total, p.subtotal_productos, p.costo_envio_aplicado,
                       p.estado, p.estado_pago, p.estado_entrega,
                       p.metodo_pago, p.envio_dom, p.latitud, p.longitud,
                       p.whatsapp_enviado, p.mercado_pago_payment_id,
                       p.fecha_pedido
                FROM pedido p
                WHERE 1=1";
        $params = [];

        if ($busqueda !== '') {
            $sql .= " AND (p.nombre_cliente LIKE :b OR p.telefono LIKE :b";
            if ($busquedaDigits !== '') {
                $sql .= " OR {$sqlPhoneNorm} LIKE :bd";
                $params[':bd'] = "%{$busquedaDigits}%";
            }
            $sql .= ")";
            $params[':b'] = "%{$busqueda}%";
        }

        if ($estadoEntrega !== '') {
            $sql .= ' AND p.estado_entrega = :ee';
            $params[':ee'] = $estadoEntrega;
        }
        if ($estadoPago !== '') {
            $sql .= ' AND p.estado_pago = :ep';
            $params[':ep'] = $estadoPago;
        }
        if ($mes !== '') {
            $sql .= ' AND MONTH(p.fecha_pedido) = :m';
            $params[':m'] = (int)$mes;
        }
        if ($anio !== '') {
            $sql .= ' AND YEAR(p.fecha_pedido) = :y';
            $params[':y'] = (int)$anio;
        }

        switch ($orden) {
            case 'precio_desc':
                $sql .= ' ORDER BY p.monto_total DESC, p.fecha_pedido DESC';
                break;
            case 'precio_asc':
                $sql .= ' ORDER BY p.monto_total ASC, p.fecha_pedido DESC';
                break;
            default:
                $sql .= ' ORDER BY p.fecha_pedido DESC';
        }

        $st = $this->conn->prepare($sql);
        foreach ($params as $k => $v) {
            $st->bindValue($k, $v);
        }
        $st->execute();
        return $st->fetchAll(PDO::FETCH_ASSOC);
    }

    public function obtenerAniosDisponibles(): array
    {
        $st = $this->conn->query('SELECT DISTINCT YEAR(fecha_pedido) AS anio FROM pedido ORDER BY anio DESC');
        $anios = array_map(fn($r) => (int)$r['anio'], $st->fetchAll(PDO::FETCH_ASSOC));
        $actual = (int)date('Y');
        if (!in_array($actual, $anios, true)) {
            array_unshift($anios, $actual);
        }
        return $anios;
    }
}
