<?php
// ✅ Errores (quitar en producción)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);

// ✅ CORS
header("Access-Control-Allow-Origin: *");
header("Access-Control-Allow-Headers: Content-Type");
header("Access-Control-Allow-Methods: POST, OPTIONS");
header("Content-Type: application/json; charset=utf-8");
header("Access-Control-Max-Age: 86400");

if ($_SERVER['REQUEST_METHOD'] === 'OPTIONS') { http_response_code(200); exit; }

// ✅ Conexión
require_once(__DIR__ . '/../config.php');
 $mysqli->set_charset("utf8mb4");

// ✅ JSON
 $input = json_decode(file_get_contents('php://input'), true);

if (!$input) { 
    echo json_encode(['success'=>false,'message'=>'JSON inválido']); 
    exit; 
}

// --- VALIDACIÓN DE PARÁMETROS ---
 $slug_tienda = isset($input['slug_tienda']) ? trim($input['slug_tienda']) : '';
 $cajero = isset($input['cajero']) ? trim($input['cajero']) : '';
 $items = isset($input['items']) ? $input['items'] : [];
 $pagos = isset($input['pagos']) ? $input['pagos'] : [];
 $subtotal = isset($input['subtotal']) ? (float)$input['subtotal'] : 0;
 $descuento = isset($input['descuento']) ? (float)$input['descuento'] : 0;
 $subtotal_con_descuento = isset($input['subtotal_con_descuento']) ? (float)$input['subtotal_con_descuento'] : 0;
 $iva = isset($input['iva']) ? (float)$input['iva'] : 0;
 $domicilio = isset($input['domicilio']) ? (float)$input['domicilio'] : 0;
 $propina = isset($input['propina']) ? (float)$input['propina'] : 0;
 $total = isset($input['total']) ? (float)$input['total'] : 0;

// Datos del cliente (opcional)
 $cliente_id = isset($input['cliente']['id']) ? (int)$input['cliente']['id'] : null;
 $cliente_nombre = isset($input['cliente']['nombre']) ? trim($input['cliente']['nombre']) : null;
 $cliente_documento = isset($input['cliente']['documento']) ? trim($input['cliente']['documento']) : null;

// --- DATOS DE CRÉDITO ---
 $es_credito = isset($input['es_credito']) && $input['es_credito'] === true;
 $datos_credito = $es_credito ? $input['datos_credito'] : null;

if ($slug_tienda === '' || $cajero === '' || empty($items)) {
    echo json_encode(['success'=>false,'message'=>'Parámetros incompletos o inválidos (se requieren: slug_tienda, cajero, items).']);
    exit;
}

// --- VALIDACIÓN DE PAGOS (SOLO PARA VENTAS DE CONTADO) ---
if (!$es_credito) {
    $total_pagado = array_sum(array_column($pagos, 'monto'));
    if (abs($total_pagado - $total) > 0.01) { // Tolerancia para decimales
        echo json_encode(['success'=>false,'message'=>'La suma de los pagos ('.currency($total_pagado).') no coincide con el total de la factura ('.currency($total).').']);
        exit;
    }
}

try {
    $mysqli->begin_transaction();

    // --- 1. GENERAR NÚMERO DE FACTURA ÚNICO ---
    $prefijo = "FAC-" . date("Ym");
    $stmt = $mysqli->prepare("SELECT COUNT(*) as count FROM facturas WHERE slug_tienda = ? AND numero_factura LIKE ?");
    $like = $prefijo . "%";
    $stmt->bind_param("ss", $slug_tienda, $like);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc();
    $consecutivo = $row['count'] + 1;
    $numero_factura = $prefijo . str_pad($consecutivo, 5, "0", STR_PAD_LEFT);
    $stmt->close();

    // --- 2. INSERTAR FACTURA ---
    // INICIO DEL CAMBIO
    // Determinar el estado de la factura basado en si es a crédito o de contado
    $estado_factura = $es_credito ? 'credito' : 'pagada';

    $stmt = $mysqli->prepare("INSERT INTO facturas 
        (slug_tienda, numero_factura, fecha, cajero, cliente_id, cliente_nombre, cliente_documento, 
        subtotal, descuento, subtotal_con_descuento, iva, domicilio, propina, total, estado) 
        VALUES (?, ?, NOW(), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); // <-- 14 placeholders '?'
    
    $cliente_id_to_bind = $cliente_id ?? 0;
    // "sssissssdddss" -> Se añadió una "s" para el nuevo parámetro $estado_factura
     $stmt->bind_param("sssisdddddddds", 
        $slug_tienda,           // 1. s (string)
        $numero_factura,        // 2. s (string)
        $cajero,                // 3. s (string)
        $cliente_id_to_bind,    // 4. i (integer)
        $cliente_nombre,        // 5. s (string)
        $cliente_documento,     // 6. s (string)
        $subtotal,              // 7. d (double/float)
        $descuento,             // 8. d (double/float)
        $subtotal_con_descuento,// 9. d (double/float)
        $iva,                   // 10. d (double/float)
        $domicilio,             // 11. d (double/float)
        $propina,               // 12. d (double/float)
        $total,                 // 13. d (double/float)
        $estado_factura         // 14. s (string) - La nueva variable para el estado
    );
    // FIN DEL CAMBIO
    
    if (!$stmt->execute()) {
        throw new Exception("Error al crear factura: " . $stmt->error);
    }
    $factura_id = $stmt->insert_id;
    $stmt->close();

    // --- 3. INSERTAR MÚLTIPLES PAGOS (SOLO SI NO ES CRÉDITO) ---
    if (!$es_credito) {
        foreach ($pagos as $pago) {
            $medio_pago = isset($pago['metodo']) ? trim($pago['metodo']) : ''; 
            $monto_pago = isset($pago['monto']) ? (float)$pago['monto'] : 0;

            if ($medio_pago === '' || $monto_pago <= 0) {
                throw new Exception("Datos de pago inválidos. Cada pago debe tener un 'metodo' y un 'monto' mayor a cero.");
            }

            $stmt = $mysqli->prepare("INSERT INTO factura_pagos (factura_id, medio_pago, monto) VALUES (?, ?, ?)");
            $stmt->bind_param("isd", $factura_id, $medio_pago, $monto_pago);
            if (!$stmt->execute()) {
                throw new Exception("Error al guardar pago con medio '$medio_pago': " . $stmt->error);
            }
            $stmt->close();
        }
    }

    // --- 4. INSERTAR DETALLES DE FACTURA Y DESCONTAR INVENTARIO ---
    foreach ($items as $item) {
        $articulo_id = isset($item['id_articulo']) ? trim($item['id_articulo']) : '';
        $cantidad = isset($item['cantidad']) ? (int)$item['cantidad'] : 0;
        $precio_unitario = isset($item['precio_unitario']) ? (float)$item['precio_unitario'] : 0;
        
        if ($articulo_id === '' || $cantidad <= 0) {
            throw new Exception("Datos de artículo inválidos en el carrito.");
        }

        $stmt = $mysqli->prepare("INSERT INTO factura_detalles 
            (factura_id, articulo_id, cantidad, precio_unitario, subtotal) 
            VALUES (?, ?, ?, ?, ?)");
        
        $subtotal_item = $cantidad * $precio_unitario;
        $stmt->bind_param("isidd", $factura_id, $articulo_id, $cantidad, $precio_unitario, $subtotal_item);
        
        if (!$stmt->execute()) {
            throw new Exception("Error al agregar detalle de factura para el artículo '$articulo_id': " . $stmt->error);
        }
        $stmt->close();

        $stmt = $mysqli->prepare("SELECT stock FROM articulos WHERE id=? AND slug_tienda=? FOR UPDATE");
        $stmt->bind_param("ss", $articulo_id, $slug_tienda);
        $stmt->execute();
        $result = $stmt->get_result();
        
        if ($result->num_rows === 0) {
            throw new Exception("Artículo con ID '$articulo_id' no encontrado en el inventario.");
        }
        
        $row = $result->fetch_assoc();
        $cantidad_anterior = (int)($row['stock'] ?? 0);
        $stmt->close();

        if ($cantidad_anterior < $cantidad) {
            throw new Exception("Stock insuficiente para el artículo '$articulo_id'. Stock actual: $cantidad_anterior, solicitado: $cantidad.");
        }

        $cantidad_actual = $cantidad_anterior - $cantidad;

        $stmt = $mysqli->prepare("UPDATE articulos SET stock=? WHERE id=? AND slug_tienda=?");
        $stmt->bind_param("iss", $cantidad_actual, $articulo_id, $slug_tienda);
        
        if (!$stmt->execute()) {
            throw new Exception("Error al actualizar stock para el artículo '$articulo_id': " . $stmt->error);
        }
        $stmt->close();

        $stmt = $mysqli->prepare("INSERT INTO inventario_movimientos
            (articulo_id, slug_tienda, cantidad_ingresada, cantidad_anterior, cantidad_actual, motivo, nota)
            VALUES (?,?,?,?,?,?,?)");
        
        $cantidad_mov = -$cantidad;
        $motivo = "venta";
        $nota = "Venta en factura #" . $numero_factura;
        
        $stmt->bind_param("ssiiiss", $articulo_id, $slug_tienda, $cantidad_mov, $cantidad_anterior, $cantidad_actual, $motivo, $nota);
        
        if (!$stmt->execute()) {
            throw new Exception("Error al registrar movimiento de inventario para el artículo '$articulo_id': " . $stmt->error);
        }
        $stmt->close();
    }

        if ($es_credito) {
        // --- LIMPIEZA Y VALIDACIÓN DE LOS VALORES ENUM ---
        $tipos_permitidos = ['contado', 'cuotas'];
        $periodicidades_permitidas = ['semanal', 'quincenal', 'mensual'];
        $tipos_interes_permitidos = ['valor', 'porcentaje'];

        $tipo_raw = trim($datos_credito['tipo'] ?? 'contado');
        $tipo_limpio = preg_replace('/[^a-zA-Z]/', '', $tipo_raw);
        $tipo_normalizado = strtolower($tipo_limpio);
        $tipo_credito = in_array($tipo_normalizado, $tipos_permitidos) ? $tipo_normalizado : 'contado';

        $periodicidad_raw = trim($datos_credito['periodicidad'] ?? 'mensual');
        $periodicidad_limpia = preg_replace('/[^a-zA-Z]/', '', $periodicidad_raw);
        $periodicidad_normalizada = strtolower($periodicidad_limpia);
        $periodicidad = in_array($periodicidad_normalizada, $periodicidades_permitidas) ? $periodicidad_normalizada : 'mensual';

        // --- NUEVA LÓGICA DE INTERESES ---
        $con_interes = isset($datos_credito['conInteres']) && $datos_credito['conInteres'] === true;
        $tipo_interes = null;
        $valor_interes = 0;
        $monto_interes_calculado = 0;

        if ($con_interes) {
            $tipo_interes_raw = trim($datos_credito['tipoInteres'] ?? 'valor');
            $tipo_interes_limpio = preg_replace('/[^a-zA-Z]/', '', $tipo_interes_raw);
            $tipo_interes_normalizado = strtolower($tipo_interes_limpio);
            $tipo_interes = in_array($tipo_interes_normalizado, $tipos_interes_permitidos) ? $tipo_interes_normalizado : 'valor';
            
            $valor_interes = isset($datos_credito['valorInteres']) ? (float)$datos_credito['valorInteres'] : 0;

            if ($tipo_interes === 'valor') {
                $monto_interes_calculado = $valor_interes;
            } else { // porcentaje
                $porcentaje = $valor_interes;
                $monto_interes_calculado = round(($total * $porcentaje) / 100);
            }
        }

        $total_credito_con_interes = $total + $monto_interes_calculado;

        $cuotas_totales = ($tipo_credito === 'cuotas') ? (int)($datos_credito['cuotas'] ?? 1) : 1;
        $valor_cuota = ($tipo_credito === 'cuotas') ? round($total_credito_con_interes / $cuotas_totales) : $total_credito_con_interes;
        
        $fecha_primer_pago = $datos_credito['fecha_primer_pago'] ?? null;
        if ($fecha_primer_pago === '') {
            $fecha_primer_pago = null;
        }

        if ($tipo_credito === 'cuotas' && !$fecha_primer_pago) {
            throw new Exception("Para financiación por cuotas, la fecha del primer pago es obligatoria.");
        }

        // --- INSERCIÓN DEL CRÉDITO CON NUEVOS CAMPOS ---
        $stmt = $mysqli->prepare("INSERT INTO creditos 
            (factura_id, slug_tienda, cliente_id, total_credito, saldo_pendiente, tipo, cuotas_totales, valor_cuota, periodicidad, fecha_primer_pago, con_interes, tipo_interes, valor_interes, monto_interes_calculado, total_credito_con_interes) 
            VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
        
        $stmt->bind_param("isiddsidssisddd", 
            $factura_id, 
            $slug_tienda, 
            $cliente_id_to_bind, 
            $total, 
            $total_credito_con_interes, // El saldo pendiente inicial es el total con intereses
            $tipo_credito, 
            $cuotas_totales, 
            $valor_cuota, 
            $periodicidad, 
            $fecha_primer_pago,
            $con_interes,
            $tipo_interes,
            $valor_interes,
            $monto_interes_calculado,
            $total_credito_con_interes
        );

        if (!$stmt->execute()) {
            $error_msg = $stmt->error;
            if (strpos($error_msg, 'Incorrect date value') !== false) {
                throw new Exception("La fecha del primer pago no es válida. Por favor, seleccione una fecha correcta.");
            } else {
                throw new Exception("Error al guardar el crédito: " . $error_msg);
            }
        }
        $credito_id = $stmt->insert_id;
        $stmt->close();

        // --- NUEVO PASO: GUARDAR EL PLAN DE PAGOS DETALLADO ---
        $stmt_plan = $mysqli->prepare("INSERT INTO plan_pagos_creditos 
            (credito_id, numero_cuota, fecha_vencimiento, valor_cuota) 
            VALUES (?, ?, ?, ?)");
        
        $fecha_vencimiento = new DateTime($fecha_primer_pago);

        for ($i = 1; $i <= $cuotas_totales; $i++) {
            if ($i > 1) {
                switch ($periodicidad) {
                    case 'semanal':
                        $fecha_vencimiento->modify('+1 week');
                        break;
                    case 'quincenal':
                        $fecha_vencimiento->modify('+15 days');
                        break;
                    case 'mensual':
                        $fecha_vencimiento->modify('+1 month');
                        break;
                }
            }

            $fecha_formateada = $fecha_vencimiento->format('Y-m-d');

            $stmt_plan->bind_param("iisd", $credito_id, $i, $fecha_formateada, $valor_cuota);
            
            if (!$stmt_plan->execute()) {
                throw new Exception("Error al guardar el plan de pagos para la cuota $i: " . $stmt_plan->error);
            }
        }
        $stmt_plan->close();
    }

    // --- 6. CONFIRMAR TRANSACCIÓN ---
    $mysqli->commit();
    
    // --- 7. RESPUESTA DE ÉXITO ---
    echo json_encode([
        'success' => true,
        'message' => 'Venta procesada correctamente',
        'factura_id' => $factura_id,
        'numero_factura' => $numero_factura,
        'total' => $total
    ]);
    
} catch (Exception $e) {
    // --- 8. REVERTIR TRANSACCIÓN EN CASO DE ERROR ---
    $mysqli->rollback();
    http_response_code(400); // Bad Request
    echo json_encode(['success'=>false,'message'=>$e->getMessage()]);
} finally {
    // --- 9. CERRAR CONEXIÓN ---
    if (isset($mysqli) && $mysqli) {
        $mysqli->close();
    }
}

// Función auxiliar para formatear moneda (opcional, para mensajes de error)
if (!function_exists('currency')) {
    function currency($v) {
        return '$' . number_format($v, 0, ',', '.');
    }
}
?>