<?php
// Configuración inicial
error_reporting(0);
ini_set('display_errors', 0);
session_start();

// Asegurar que la salida
header('Content-Type: application/json');
ob_start();

try {
    require_once 'includes/db.php';
    
    if (!isset($_SESSION['usuario_id'])) {
        throw new Exception('Sesión no válida');
    }

    // Validar datos POST
    $required = ['producto_id', 'cliente_id', 'cantidad', 'precio_unitario', 'tipo_precio'];
    foreach ($required as $field) {
        if (!isset($_POST[$field])) {
            throw new Exception("Campo requerido: $field");
        }
    }

    $db = new Database();
    $pdo = $db->getPDO();
    $pdo->beginTransaction();

    // Obtener grupo_id existente o crear uno nuevo
    $stmt = $pdo->prepare("
        SELECT grupo_id, venta_id 
        FROM venta_items 
        WHERE cliente_id = ? AND estado = 'EN_CURSO' 
        AND grupo_id IS NOT NULL 
        ORDER BY id DESC LIMIT 1
    ");
    $stmt->execute([(int)$_POST['cliente_id']]);
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    
    // Modificar la extracción de cantidad de cuotas
    $cantidad_cuotas = 0;
    $es_semanal = isset($_POST['es_semanal']) && $_POST['es_semanal'] === 'true';
    $dias_credito = 0;
    $tipo_credito = null; // Valor por defecto

    if (strpos($_POST['tipo_precio'], 'credito_') !== false) {
        // Extraer el número base de cuotas
        $base_cuotas = (int)str_replace(['credito_', '_semanal'], '', $_POST['tipo_precio']);
        
        // Si es semanal, multiplicar por 4 para el cálculo de pagos
        $cantidad_cuotas = $es_semanal ? $base_cuotas * 4 : $base_cuotas;
        
        // Calcular días de crédito: 7.5 días si es semanal, 30 días si es mensual
        $dias_entre_cuotas = $es_semanal ? 7.5 : 30;
        // Para días de crédito, usamos el número base de cuotas para semanal
        $dias_credito = $dias_entre_cuotas * ($es_semanal ? $base_cuotas : $cantidad_cuotas);
        
        // Establecer el tipo de crédito
        $tipo_credito = $es_semanal ? 'semanal' : 'mensual';
    }

    // Modificar el SQL para incluir información de si es semanal en grupo_id
    $grupo_id = $result['grupo_id'] ?: uniqid($es_semanal ? 'venta_sem_' : 'venta_');
    
    // Función para generar un número compacto a partir de una fecha
    function generar_numero_compacto($fecha) {
        // Convertimos la fecha a un timestamp Unix
        $timestamp = strtotime($fecha);
        
        // Verificamos si el timestamp tiene más de 10 dígitos
        // Si tiene más de 10 dígitos, truncamos para mantener 10 dígitos
        $numero_compacto = $timestamp % 10000000000;  // Limitar a 10 dígitos
        
        return $numero_compacto;
    }
    
    // Generar un venta_id numérico único si no existe, usando la fecha y hora actual
    $venta_id_num = $result['venta_id'] ?: generar_numero_compacto(date('Y-m-d H:i:s'));

    // Guardar información de la venta activa en sesión
    $_SESSION['venta_activa'] = [
        'cliente_id' => $_POST['cliente_id'],
        'cliente_nombre' => $_POST['cliente_nombre'],
        'grupo_id' => $grupo_id,
        'venta_id' => $venta_id_num
    ];

    // Preparar datos de la venta
    $sql = "INSERT INTO venta_items (
        producto_id, cliente_id, cantidad, precio_unitario, subtotal,
        tipo_pago, cantidad_cuotas, created_at, estado, vendedor_id,
        primera_cuota, tipo_venta, usuario_id, grupo_id, venta_id,
        dias_credito, tipo_credito
    ) VALUES (
        :producto_id, :cliente_id, :cantidad, :precio_unitario, :subtotal,
        :tipo_pago, :cantidad_cuotas, NOW(), 'EN_CURSO', :vendedor_id,
        :primera_cuota, :tipo_venta, :usuario_id, :grupo_id, :venta_id,
        :dias_credito, :tipo_credito
    )";

    $stmt = $pdo->prepare($sql);
    
    // Asegurarse de que el precio unitario sea un número válido
    $precio_unitario = !empty($_POST['precio_unitario']) ? (float)$_POST['precio_unitario'] : 0;
    
    // Si el precio es 0, intentar calcularlo basado en el tipo de precio seleccionado
    if ($precio_unitario <= 0) {
        // Intentar obtener el precio del producto desde la base de datos
        $stmt_prod = $pdo->prepare("SELECT precio_venta1 as precio, cuota2, cuota3, cuota6, cuota10, cuota12, cuota15, cuota18 FROM productos WHERE id = ?");
        $stmt_prod->execute([(int)$_POST['producto_id']]);
        $producto = $stmt_prod->fetch(PDO::FETCH_ASSOC);
        
        if ($producto) {
            // Determinar qué precio usar según el tipo_precio seleccionado
            $tipo_precio = $_POST['tipo_precio'];
            if (strpos($tipo_precio, 'credito_') === 0) {
                // Extraer el número de cuotas del tipo_precio
                $cuotas_str = str_replace(['credito_', '_semanal'], '', $tipo_precio);
                $cuotas = (int)$cuotas_str;
                
                // Buscar el precio correspondiente en el producto
                $campo_cuota = "cuota{$cuotas}";
                if (isset($producto[$campo_cuota]) && $producto[$campo_cuota] > 0) {
                    // Calcular el precio total multiplicando el monto de la cuota por el número de cuotas
                    $precio_unitario = $producto[$campo_cuota] * $cuotas;
                } else {
                    // Si no hay un precio específico para esa cuota, usar el precio regular
                    $precio_unitario = $producto['precio'];
                }
            } else {
                // Para ventas al contado, usar el precio regular
                $precio_unitario = $producto['precio'];
            }
        }
    }
    
    $subtotal = $precio_unitario * (int)$_POST['cantidad'];
    $tipo_venta = strpos($_POST['tipo_precio'], 'credito_') !== false ? 'credito' : 'contado';
    $tipo_pago = $tipo_venta;

    $result = $stmt->execute([
        ':producto_id' => (int)$_POST['producto_id'],
        ':cliente_id' => (int)$_POST['cliente_id'],
        ':cantidad' => (int)$_POST['cantidad'],
        ':precio_unitario' => $precio_unitario,
        ':subtotal' => $subtotal,
        ':tipo_pago' => $tipo_pago,
        ':cantidad_cuotas' => $cantidad_cuotas,
        ':vendedor_id' => (int)$_SESSION['usuario_id'],
        ':primera_cuota' => !empty($_POST['primera_cuota']) ? 1 : 0,
        ':tipo_venta' => $tipo_venta,
        ':usuario_id' => (int)$_SESSION['usuario_id'],
        ':grupo_id' => $grupo_id,
        ':venta_id' => $venta_id_num,
        ':dias_credito' => $dias_credito,
        ':tipo_credito' => $tipo_credito
    ]);

    if (!$result) {
        throw new Exception('Error al guardar la venta');
    }

    $venta_id = $pdo->lastInsertId(); // Obtener el ID de la venta recién insertada

    $pdo->commit();
    
    // Limpiar buffer antes de enviar respuesta
    while (ob_get_level()) {
        ob_end_clean();
    }

    echo json_encode([
        'success' => true,
        'message' => 'Venta guardada correctamente',
        'venta_id' => $venta_id // Asegúrate de incluir el ID de la venta
    ]);
    exit;

} catch (Exception $e) {
    while (ob_get_level()) {
        ob_end_clean();
    }

    echo json_encode([
        'success' => false,
        'message' => $e->getMessage()
    ]);
    exit;
}
