<?php

// Incluir el archivo de conexión a la base de datos
// Se utiliza require_once para asegurar que se incluya solo una vez y falle si no se encuentra
require_once '../services/pdo_connection.php';

/**
 * Clase para manejar las operaciones del historial de pedidos.
 * Combina la funcionalidad de lectura y manipulación de datos.
 */
class Historial {

    // Atributos de la clase
    private $id_historial;
    private $id_pedido;
    private $conn; // Conexión a la base de datos

    /**
     * Constructor de la clase.
     * Inicializa la conexión a la base de datos al crear una instancia.
     */
    public function __construct() {
        $database = new Database();
        $this->conn = $database->getConnection();
    }

    // --- Métodos de Lectura (tomados de la primera clase) ---

    /**
     * Lee todos los registros del historial.
     * @return PDOStatement Retorna el objeto PDOStatement con los resultados.
     */
    public function leer() {
        $query = "SELECT id_historial, id_pedido FROM historial ORDER BY id_historial ASC";
        $stmt = $this->conn->prepare($query);
        $stmt->execute();
        return $stmt;
    }
    
    /**
     * Lee los registros del historial con filtros de búsqueda.
     * @param string $busqueda Término de búsqueda para nombre o teléfono del cliente.
     * @param string $fecha Fecha del pedido.
     * @param string $estado Estado del pedido.
     * @return PDOStatement Retorna el objeto PDOStatement con los resultados filtrados.
     */
    public function leerConFiltros($busqueda, $fecha, $estado) {
        $query = "SELECT h.id_historial, h.id_pedido 
                  FROM historial h
                  LEFT JOIN pedido p ON h.id_pedido = p.id_pedido";

        $conditions = [];
        $params = [];

        if (!empty($busqueda)) {
            $conditions[] = "(p.nombre_cliente LIKE ? OR p.telefono LIKE ?)";
            $params[] = "%" . $busqueda . "%";
            $params[] = "%" . $busqueda . "%";
        }

        if (!empty($fecha)) {
            $conditions[] = "DATE(p.fecha_pedido) = ?";
            $params[] = $fecha;
        }

        if (!empty($estado)) {
            $conditions[] = "p.estado = ?";
            $params[] = $estado;
        }

        if (count($conditions) > 0) {
            $query .= " WHERE " . implode(' AND ', $conditions);
        }

        $query .= " ORDER BY h.id_historial DESC";

        $stmt = $this->conn->prepare($query);
        $stmt->execute($params);
        
        return $stmt;
    }

    /**
     * Obtiene todos los registros del historial.
     * @return array Array con todos los registros de historial.
     */
    public function getAll() {
        try {
            $query = "SELECT * FROM historial ORDER BY id_historial DESC";
            $stmt = $this->conn->prepare($query);
            $stmt->execute();
            
            return $stmt->fetchAll(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al obtener historial: " . $e->getMessage());
            return [];
        }
    }

    /**
     * Obtiene el historial por ID de pedido.
     * @param int $idPedido ID del pedido a buscar.
     * @return array|false Retorna el registro de historial o false si no existe.
     */
    public function getByPedidoId($idPedido) {
        try {
            $idPedido = filter_var($idPedido, FILTER_VALIDATE_INT);
            if ($idPedido === false || $idPedido <= 0) {
                throw new InvalidArgumentException("ID de pedido inválido");
            }

            $query = "SELECT * FROM historial WHERE id_pedido = :id_pedido LIMIT 1";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id_pedido', $idPedido, PDO::PARAM_INT);
            $stmt->execute();
            
            return $stmt->fetch(PDO::FETCH_ASSOC);
        } catch (PDOException $e) {
            error_log("Error al obtener historial por ID de pedido: " . $e->getMessage());
            return false;
        } catch (InvalidArgumentException $e) {
            error_log("Error de validación: " . $e->getMessage());
            return false;
        }
    }

    // --- Métodos de Manipulación (tomados de la segunda clase) ---

    /**
     * Crea un nuevo registro en el historial.
     * @param int $idPedido ID del pedido relacionado.
     * @return bool|int Retorna el ID del nuevo registro o false en caso de error.
     */
    public function create($idPedido) {
        try {
            $idPedido = filter_var($idPedido, FILTER_VALIDATE_INT);
            if ($idPedido === false || $idPedido <= 0) {
                throw new InvalidArgumentException("ID de pedido inválido");
            }

            $query = "INSERT INTO historial (id_pedido) VALUES (:id_pedido)";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id_pedido', $idPedido, PDO::PARAM_INT);

            if ($stmt->execute()) {
                return $this->conn->lastInsertId();
            }
            
            return false;
        } catch (PDOException $e) {
            error_log("Error al crear registro en historial: " . $e->getMessage());
            return false;
        } catch (InvalidArgumentException $e) {
            error_log("Error de validación en historial: " . $e->getMessage());
            return false;
        }
    }

    /**
     * Elimina un registro del historial.
     * @param int $idHistorial ID del registro a eliminar.
     * @return bool True si se eliminó correctamente, false en caso contrario.
     */
    public function delete($idHistorial) {
        try {
            $idHistorial = filter_var($idHistorial, FILTER_VALIDATE_INT);
            if ($idHistorial === false || $idHistorial <= 0) {
                throw new InvalidArgumentException("ID de historial inválido");
            }

            $query = "DELETE FROM historial WHERE id_historial = :id_historial";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id_historial', $idHistorial, PDO::PARAM_INT);
            
            return $stmt->execute();
        } catch (PDOException $e) {
            error_log("Error al eliminar registro de historial: " . $e->getMessage());
            return false;
        } catch (InvalidArgumentException $e) {
            error_log("Error de validación: " . $e->getMessage());
            return false;
        }
    }

    // --- Métodos Getters y Setters ---

    public function getIdHistorial() { return $this->id_historial; }
    public function setIdHistorial($id_historial) { $this->id_historial = $id_historial; }
    public function getIdPedido() { return $this->id_pedido; }
    public function setIdPedido($id_pedido) { $this->id_pedido = $id_pedido; }
}

?>
