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

class ModelProducto
{
    private $conn;
    private $table_name = "producto";

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

    // Crear nuevo producto
    public function crear($id_categoria, $titulo, $descripcion, $precio, $foto_url = null, $activo = 1)
    {
        try {
            $query = "INSERT INTO " . $this->table_name . " (id_categoria, titulo, descripcion, precio, foto_url, activo) 
                      VALUES (:id_categoria, :titulo, :descripcion, :precio, :foto_url, :activo)";
            $stmt = $this->conn->prepare($query);

            $stmt->bindParam(':id_categoria', $id_categoria);
            $stmt->bindParam(':titulo', $titulo);
            $stmt->bindParam(':descripcion', $descripcion);
            $stmt->bindParam(':precio', $precio);
            $stmt->bindParam(':foto_url', $foto_url);
            $stmt->bindParam(':activo', $activo);

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

    // Leer todos los productos con información de categoría
    public function leerTodos($soloActivos = false)
    {
        try {
            $whereClause = $soloActivos ? "WHERE p.activo = 1" : "";
            $query = "SELECT p.id_producto, p.id_categoria, p.titulo, p.descripcion, p.precio, 
                             p.foto_url, p.activo, c.nombre as categoria_nombre
                      FROM " . $this->table_name . " p
                      INNER JOIN categoria c ON p.id_categoria = c.id_categoria
                      $whereClause
                      ORDER BY c.nombre ASC, p.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()];
        }
    }

    // Leer productos por categoría
    public function leerPorCategoria($id_categoria, $soloActivos = false)
    {
        try {
            $whereClause = "WHERE p.id_categoria = :id_categoria";
            if ($soloActivos) {
                $whereClause .= " AND p.activo = 1";
            }

            $query = "SELECT p.id_producto, p.id_categoria, p.titulo, p.descripcion, p.precio, 
                             p.foto_url, p.activo, c.nombre as categoria_nombre
                      FROM " . $this->table_name . " p
                      INNER JOIN categoria c ON p.id_categoria = c.id_categoria
                      $whereClause
                      ORDER BY p.titulo ASC";

            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id_categoria', $id_categoria);
            $stmt->execute();

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

    // Leer un producto por ID
    public function leerPorId($id)
    {
        try {
            $query = "SELECT p.id_producto, p.id_categoria, p.titulo, p.descripcion, p.precio, 
                             p.foto_url, p.activo, c.nombre as categoria_nombre
                      FROM " . $this->table_name . " p
                      INNER JOIN categoria c ON p.id_categoria = c.id_categoria
                      WHERE p.id_producto = :id";

            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->execute();

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

    // Actualizar producto
    public function actualizar($id, $id_categoria, $titulo, $descripcion, $precio, $foto_url = null, $activo = 1)
    {
        try {
            $query = "UPDATE " . $this->table_name . " 
                      SET id_categoria = :id_categoria, titulo = :titulo, descripcion = :descripcion, 
                          precio = :precio, foto_url = :foto_url, activo = :activo 
                      WHERE id_producto = :id";

            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->bindParam(':id_categoria', $id_categoria);
            $stmt->bindParam(':titulo', $titulo);
            $stmt->bindParam(':descripcion', $descripcion);
            $stmt->bindParam(':precio', $precio);
            $stmt->bindParam(':foto_url', $foto_url);
            $stmt->bindParam(':activo', $activo);

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

    // Cambiar estado activo/inactivo
    public function cambiarEstado($id, $activo)
    {
        try {
            $query = "UPDATE " . $this->table_name . " SET activo = :activo WHERE id_producto = :id";
            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':id', $id);
            $stmt->bindParam(':activo', $activo);

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

    // Eliminar producto (eliminación lógica - cambiar a inactivo)
    public function eliminar($id)
    {
        try {
            // Primero verificar si el producto existe y está en uso en pedidos
            $checkQuery = "SELECT COUNT(*) as total FROM detalle_pedido WHERE id_producto = :id";
            $checkStmt = $this->conn->prepare($checkQuery);
            $checkStmt->bindParam(':id', $id);
            $checkStmt->execute();
            $result = $checkStmt->fetch(PDO::FETCH_ASSOC);

            if ($result['total'] > 0) {
                // Si tiene pedidos asociados, solo desactivar
                return $this->cambiarEstado($id, 0);
            } else {
                // Si no tiene pedidos, eliminar físicamente
                $query = "DELETE FROM " . $this->table_name . " WHERE id_producto = :id";
                $stmt = $this->conn->prepare($query);
                $stmt->bindParam(':id', $id);

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

    // Buscar productos por término
    public function buscar($termino, $soloActivos = false)
    {
        try {
            $whereClause = "WHERE (p.titulo LIKE :termino OR p.descripcion LIKE :termino OR c.nombre LIKE :termino)";
            if ($soloActivos) {
                $whereClause .= " AND p.activo = 1";
            }

            $query = "SELECT p.id_producto, p.id_categoria, p.titulo, p.descripcion, p.precio, 
                             p.foto_url, p.activo, c.nombre as categoria_nombre
                      FROM " . $this->table_name . " p
                      INNER JOIN categoria c ON p.id_categoria = c.id_categoria
                      $whereClause
                      ORDER BY c.nombre ASC, p.titulo ASC";

            $stmt = $this->conn->prepare($query);
            $terminoBusqueda = "%$termino%";
            $stmt->bindParam(':termino', $terminoBusqueda);
            $stmt->execute();

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

    // Obtener productos por rango de precio
    public function leerPorRangoPrecio($precio_min, $precio_max, $soloActivos = false)
    {
        try {
            $whereClause = "WHERE p.precio BETWEEN :precio_min AND :precio_max";
            if ($soloActivos) {
                $whereClause .= " AND p.activo = 1";
            }

            $query = "SELECT p.id_producto, p.id_categoria, p.titulo, p.descripcion, p.precio, 
                             p.foto_url, p.activo, c.nombre as categoria_nombre
                      FROM " . $this->table_name . " p
                      INNER JOIN categoria c ON p.id_categoria = c.id_categoria
                      $whereClause
                      ORDER BY p.precio ASC";

            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':precio_min', $precio_min);
            $stmt->bindParam(':precio_max', $precio_max);
            $stmt->execute();

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

    // Verificar si existe un producto con el mismo título en la misma categoría
    public function existeTitulo($titulo, $id_categoria, $excluirId = null)
    {
        try {
            $query = "SELECT COUNT(*) as total FROM " . $this->table_name . " 
                      WHERE titulo = :titulo AND id_categoria = :id_categoria";
            if ($excluirId) {
                $query .= " AND id_producto != :excluir_id";
            }

            $stmt = $this->conn->prepare($query);
            $stmt->bindParam(':titulo', $titulo);
            $stmt->bindParam(':id_categoria', $id_categoria);
            if ($excluirId) {
                $stmt->bindParam(':excluir_id', $excluirId);
            }

            $stmt->execute();
            $result = $stmt->fetch(PDO::FETCH_ASSOC);
            return $result['total'] > 0;
        } catch (PDOException $e) {
            return false;
        }
    }

    public function getProductoByNombre($nombre)
    {
        $query = "SELECT * FROM producto WHERE titulo = :nombre AND activo = 1 LIMIT 1";
        $stmt = $this->conn->prepare($query);
        $stmt->bindParam(':nombre', $nombre);
        $stmt->execute();
        return $stmt->fetch(PDO::FETCH_ASSOC);
    }
}


