<?php
/**
 * Función para guardar los datos de una factura en la tabla facturados
 * 
 * @param PDO $pdo Conexión a la base de datos
 * @param int $clienteId ID del cliente
 * @param int $ventaId ID de la venta
 * @param array $datosRespuesta Datos de respuesta del servidor de facturación
 * @param string $condicionTipo Tipo de condición (1=contado, 2=crédito)
 * @param int $numeroFactura Número de factura generado
 * @return bool Retorna true si se guardó correctamente, false en caso contrario
 */
function guardarFacturaEnBD($pdo, $clienteId, $ventaId, $datosRespuesta, $condicionTipo, $numeroFactura) {
    try {
        // Obtener información del cliente
        $stmtCliente = $pdo->prepare("SELECT * FROM clientes WHERE id_cliente = ?");
        $stmtCliente->execute([$clienteId]);
        $cliente = $stmtCliente->fetch(PDO::FETCH_ASSOC);
        
        if (!$cliente) {
            throw new Exception("No se encontró información del cliente con ID: $clienteId");
        }
        
        // Obtener todos los items de la venta
        $stmtItems = $pdo->prepare("
            SELECT 
                vi.*,
                p.id as producto_id,
                p.codigo,
                p.titulo,
                p.iva,
                vi.dias_credito
            FROM venta_items vi
            INNER JOIN productos p ON vi.producto_id = p.id
            WHERE vi.venta_id = ?
        ");
        $stmtItems->execute([$ventaId]);
        $items = $stmtItems->fetchAll(PDO::FETCH_ASSOC);
        
        if (empty($items)) {
            throw new Exception("No se encontraron items para la venta ID: $ventaId");
        }
        
        // Determinar la condición (contado o crédito)
        $condicion = ($condicionTipo == 1) ? 'contado' : 'credito';
        
        // Fecha actual
        $fechaFactura = date('Y-m-d H:i:s');
        
        // CDC de la factura (si está disponible)
        $cdc = isset($datosRespuesta['CDC']) ? $datosRespuesta['CDC'] : null;
        
        // Obtener información adicional para formatear el número de factura
        $stmtConfigFactura = $pdo->prepare("SELECT establecimiento, punto FROM configuracion_facturacion LIMIT 1");
        $stmtConfigFactura->execute();
        $configFactura = $stmtConfigFactura->fetch(PDO::FETCH_ASSOC);
        
        // Formatear el número de factura como "000-000-0000000"
        $establecimiento = str_pad($configFactura['establecimiento'], 3, "0", STR_PAD_LEFT);
        $punto = str_pad($configFactura['punto'], 3, "0", STR_PAD_LEFT);
        $numero = str_pad($numeroFactura, 7, "0", STR_PAD_LEFT);
        $facturaFormateada = $establecimiento . "-" . $punto . "-" . $numero;
        
        // Iniciar transacción
        $pdo->beginTransaction();
        
        // Preparar la consulta para insertar cada item
        $stmtInsert = $pdo->prepare("
            INSERT INTO facturados (
                venta_id, cliente_id, cliente_nombre, cliente_ruc,
                factura_numero, condicion, producto_id, producto_titulo,
                cantidad, precio_unitario, subtotal, iva, monto_iva,
                total, fecha_factura, cdc, dias_credito, estado
            ) VALUES (
                :venta_id, :cliente_id, :cliente_nombre, :cliente_ruc,
                :factura_numero, :condicion, :producto_id, :producto_titulo,
                :cantidad, :precio_unitario, :subtotal, :iva, :monto_iva,
                :total, :fecha_factura, :cdc, :dias_credito, 'activo'
            )
        ");
        
        // Insertar cada item de la factura
        foreach ($items as $item) {
            // Calcular valores
            $cantidad = floatval($item['cantidad']);
            $precioUnitario = floatval($item['precio_unitario']);
            $subtotal = $cantidad * $precioUnitario;
            $iva = floatval($item['iva']);
            $montoIva = $subtotal * ($iva / 100);
            $total = $subtotal + $montoIva;
            $diasCredito = isset($item['dias_credito']) ? intval($item['dias_credito']) : 0;
            
            // Nombre del cliente o razón social
            $clienteNombre = !empty($cliente['razon_social']) ? 
                $cliente['razon_social'] : 
                trim($cliente['nombre'] . ' ' . $cliente['apellidos']);
            
            // Ejecutar la inserción
            $stmtInsert->execute([
                ':venta_id' => $ventaId,
                ':cliente_id' => $clienteId,
                ':cliente_nombre' => $clienteNombre,
                ':cliente_ruc' => $cliente['numero_documento'],
                ':factura_numero' => $facturaFormateada, // Usar el número formateado
                ':condicion' => $condicion,
                ':producto_id' => $item['producto_id'],
                ':producto_titulo' => $item['titulo'],
                ':cantidad' => $cantidad,
                ':precio_unitario' => $precioUnitario,
                ':subtotal' => $subtotal,
                ':iva' => $iva,
                ':monto_iva' => $montoIva,
                ':total' => $total,
                ':fecha_factura' => $fechaFactura,
                ':cdc' => $cdc,
                ':dias_credito' => $diasCredito
            ]);
        }
        
        // Confirmar la transacción
        $pdo->commit();
       
        return true;
        
    } catch (Exception $e) {
        // Revertir la transacción en caso de error
        if ($pdo->inTransaction()) {
            $pdo->rollBack();
        }
        
 
        return false;
    }
}
