<?php
require_once 'Sala.php';
require_once 'Boleto.php';
require_once 'Venta.php';

class BaseDatos {
    private $conexion;
    
    public function __construct($host, $usuario, $password, $nombreBD) {
        $this->conexion = new mysqli($host, $usuario, $password, $nombreBD);
        
        if ($this->conexion->connect_error) {
            die("Error de conexión: " . $this->conexion->connect_error);
        }
    }
    
    public function cargarSala($idSala) {
        $sala = null;
        $query = "SELECT id, nombre FROM salas WHERE id = ?";
        $stmt = $this->conexion->prepare($query);
        $stmt->bind_param("i", $idSala);
        $stmt->execute();
        $result = $stmt->get_result();
        
        if ($fila = $result->fetch_assoc()) {
            $sala = new Sala($fila['id'], $fila['nombre']);
            
            // Cargar boletos de la sala
            $queryBoletos = "SELECT id, fila, numero, precio, estado FROM boletos WHERE id_sala = ?";
            $stmtBoletos = $this->conexion->prepare($queryBoletos);
            $stmtBoletos->bind_param("i", $idSala);
            $stmtBoletos->execute();
            $resultBoletos = $stmtBoletos->get_result();
            
            $boletos = [];
            while ($filaBoleto = $resultBoletos->fetch_assoc()) {
                $boleto = new Boleto($filaBoleto['id'], $filaBoleto['fila'], $filaBoleto['numero'], $filaBoleto['precio']);
                if ($filaBoleto['estado'] === 'vendido') {
                    $boleto->marcarComoVendido();
                }
                $boletos[] = $boleto;
            }
            
            // Asignar boletos a la sala
            $sala->setBoletos($boletos);
        }
        
        return $sala;
    }
    
    public function guardarVenta($venta) {
        // Iniciar transacción
        $this->conexion->begin_transaction();
        
        try {
            // Insertar venta
            $query = "INSERT INTO ventas (id, fecha, nombre_cliente, total) VALUES (?, ?, ?, ?)";
            $stmt = $this->conexion->prepare($query);
            $id = $venta->getId();
            $fecha = $venta->getFecha();
            $nombreCliente = $venta->getNombreCliente();
            $total = $venta->getTotal();
            $stmt->bind_param("sssd", $id, $fecha, $nombreCliente, $total);
            $stmt->execute();
            
            // Actualizar estado de boletos
            foreach ($venta->getBoletos() as $boleto) {
                $queryBoleto = "UPDATE boletos SET estado = 'vendido' WHERE id = ?";
                $stmtBoleto = $this->conexion->prepare($queryBoleto);
                $idBoleto = $boleto->getId();
                $stmtBoleto->bind_param("i", $idBoleto);
                $stmtBoleto->execute();
                
                // Insertar relación venta-boleto
                $queryRelacion = "INSERT INTO venta_boletos (id_venta, id_boleto) VALUES (?, ?)";
                $stmtRelacion = $this->conexion->prepare($queryRelacion);
                $stmtRelacion->bind_param("si", $id, $idBoleto);
                $stmtRelacion->execute();
            }
            
            // Confirmar transacción
            $this->conexion->commit();
            return true;
        } catch (Exception $e) {
            // Revertir transacción en caso de error
            $this->conexion->rollback();
            return false;
        }
    }
    
    public function cerrarConexion() {
        $this->conexion->close();
    }
}