<?php
require_once '../services/pdo_connection.php';

class ModelProductoEvento {
    private $conn;
    private $table_name = "producto_evento";

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

    /* =====================  C  ===================== */
    public function crear($titulo, $descripcion, $precio, $foto_url = null, $activo = 1) {
        try {
            $query = "INSERT INTO {$this->table_name}
                      (titulo, descripcion, precio, foto_url, activo)
                      VALUES (:titulo, :descripcion, :precio, :foto_url, :activo)";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':titulo', $titulo);
            $stmt->bindParam(':descripcion', $descripcion);
            $stmt->bindParam(':precio', $precio);
            $stmt->bindParam(':foto_url', $foto_url);
            $stmt->bindParam(':activo', $activo, PDO::PARAM_INT);

            if ($stmt->execute()) {
                return [
                    'success' => true,
                    'message' => 'Producto de evento creado exitosamente',
                    'id'      => $this->conn->lastInsertId()
                ];
            }
            return ['success' => false, 'message' => 'Error al crear el producto de evento'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    /* =====================  R  ===================== */
    public function leerTodos($soloActivos = false) {
        try {
            $where = $soloActivos ? "WHERE activo = 1" : "";
            $query = "SELECT id_producto_evento, titulo, descripcion, precio, foto_url, activo
                      FROM {$this->table_name}
                      $where
                      ORDER BY titulo ASC";
            $stmt = $this->conn->prepare($query);
            $stmt->execute();

            return ['success' => true, 'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    public function leerPorId($id) {
        try {
            $query = "SELECT id_producto_evento, titulo, descripcion, precio, foto_url, activo
                      FROM {$this->table_name}
                      WHERE id_producto_evento = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $stmt->execute();

            $row = $stmt->fetch(PDO::FETCH_ASSOC);
            if ($row) return ['success' => true, 'data' => $row];
            return ['success' => false, 'message' => 'Producto de evento no encontrado'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    /* =====================  U  ===================== */
    public function actualizar($id, $titulo, $descripcion, $precio, $foto_url = null, $activo = 1) {
        try {
            $query = "UPDATE {$this->table_name}
                      SET titulo = :titulo,
                          descripcion = :descripcion,
                          precio = :precio,
                          foto_url = :foto_url,
                          activo = :activo
                      WHERE id_producto_evento = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $stmt->bindParam(':titulo', $titulo);
            $stmt->bindParam(':descripcion', $descripcion);
            $stmt->bindParam(':precio', $precio);
            $stmt->bindParam(':foto_url', $foto_url);
            $stmt->bindParam(':activo', $activo, PDO::PARAM_INT);

            if ($stmt->execute() && $stmt->rowCount() > 0) {
                return ['success' => true, 'message' => 'Producto de evento actualizado exitosamente'];
            }
            return ['success' => false, 'message' => 'No se realizaron cambios o producto no encontrado'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    /* =====================  D / Lógico ===================== */
    public function cambiarEstado($id, $activo) {
        try {
            $query = "UPDATE {$this->table_name} SET activo = :activo WHERE id_producto_evento = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $stmt->bindParam(':activo', $activo, PDO::PARAM_INT);

            if ($stmt->execute() && $stmt->rowCount() > 0) {
                $estado = $activo ? 'activado' : 'desactivado';
                return ['success' => true, 'message' => "Producto de evento $estado exitosamente"];
            }
            return ['success' => false, 'message' => 'Producto de evento no encontrado'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    public function eliminar($id) {
        try {
            // ¿Se usa en agenda?
            $check = $this->conn->prepare("SELECT COUNT(*) AS total FROM agenda WHERE id_producto_evento = :id");
            $check->bindParam(':id', $id, PDO::PARAM_INT);
            $check->execute();
            $total = (int)$check->fetch(PDO::FETCH_ASSOC)['total'];

            if ($total > 0) {
                // Eliminación lógica si está referenciado
                return $this->cambiarEstado($id, 0);
            }

            // Eliminación física si no hay referencias
            $stmt = $this->conn->prepare("DELETE FROM {$this->table_name} WHERE id_producto_evento = :id");
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);

            if ($stmt->execute() && $stmt->rowCount() > 0) {
                return ['success' => true, 'message' => 'Producto de evento eliminado exitosamente'];
            }
            return ['success' => false, 'message' => 'Producto de evento no encontrado'];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    /* =====================  Búsquedas/Filtros ===================== */
    public function buscar($termino, $soloActivos = false) {
        try {
            $where = "WHERE (titulo LIKE :q OR descripcion LIKE :q)";
            if ($soloActivos) $where .= " AND activo = 1";

            $query = "SELECT id_producto_evento, titulo, descripcion, precio, foto_url, activo
                      FROM {$this->table_name}
                      $where
                      ORDER BY titulo ASC";
            $stmt = $this->conn->prepare($query);
            $like = "%{$termino}%";
            $stmt->bindParam(':q', $like);
            $stmt->execute();

            return ['success' => true, 'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    public function leerPorRangoPrecio($precio_min, $precio_max, $soloActivos = false) {
        try {
            $where = "WHERE precio BETWEEN :min AND :max";
            if ($soloActivos) $where .= " AND activo = 1";

            $query = "SELECT id_producto_evento, titulo, descripcion, precio, foto_url, activo
                      FROM {$this->table_name}
                      $where
                      ORDER BY precio ASC";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':min', $precio_min);
            $stmt->bindParam(':max', $precio_max);
            $stmt->execute();

            return ['success' => true, 'data' => $stmt->fetchAll(PDO::FETCH_ASSOC)];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }

    /* =====================  Validaciones/Stats ===================== */
    public function existeTitulo($titulo, $excluirId = null) {
        try {
            $sql = "SELECT COUNT(*) AS total FROM {$this->table_name} WHERE titulo = :titulo";
            if ($excluirId) $sql .= " AND id_producto_evento != :id";
            $stmt = $this->conn->prepare($sql);
            $stmt->bindParam(':titulo', $titulo);
            if ($excluirId) $stmt->bindParam(':id', $excluirId, PDO::PARAM_INT);
            $stmt->execute();
            return ((int)$stmt->fetch(PDO::FETCH_ASSOC)['total']) > 0;
        } catch (PDOException $e) {
            return false;
        }
    }

    public function obtenerEstadisticas($id) {
        try {
            $query = "SELECT
                        COUNT(*)                                         AS total_agendas,
                        SUM(CASE WHEN estado = 'RESERVADO'  THEN 1 ELSE 0 END) AS agendas_reservadas,
                        SUM(CASE WHEN estado = 'COMPLETADO' THEN 1 ELSE 0 END) AS agendas_completadas,
                        SUM(CASE WHEN estado = 'CANCELADO'  THEN 1 ELSE 0 END) AS agendas_canceladas
                      FROM agenda
                      WHERE id_producto_evento = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id, PDO::PARAM_INT);
            $stmt->execute();

            return ['success' => true, 'data' => $stmt->fetch(PDO::FETCH_ASSOC)];
        } catch (PDOException $e) {
            return ['success' => false, 'message' => 'Error: ' . $e->getMessage()];
        }
    }
}
