<?php
include 'is_logged.php';

/**
 * Procesamiento de facturación - Versión profesional corregida
 */

/* Inicia validación del lado del servidor */
if (empty($_POST['id_cliente'])) {
    $errors[] = "ID de cliente requerido";
    displayErrors($errors);
    exit;
}

/* Connect To Database */
require_once "../db.php";
require_once "../php_conexion.php";
require_once "../funciones.php";

/* Inicialización de variables de sesión */
$session_id      = session_id();
$sucursal_users  = $_SESSION['sucursal_users'];
$simbolo_moneda  = get_row('perfil', 'moneda', 'id_perfil', 1);

/* Validación y sanitización de datos */
$id_cliente        = intval($_POST['id_cliente']);
$id_vendedor       = intval($_SESSION['id_users']);
$users             = intval($_SESSION['id_users']);
$condiciones       = mysqli_real_escape_string($conexion, strip_tags($_REQUEST['tipoPago'], ENT_QUOTES));
$numero_cotizacion = mysqli_real_escape_string($conexion, strip_tags($_REQUEST["cotizacion"], ENT_QUOTES));
$id_comp           = intval($_POST['id_comp']);
$resibido          = floatval($_POST['resibido']);
$total_ft          = floatval($_POST['total_ft']);

/* Variables adicionales */
$id_mecanico  = 0;
$id_empleado  = intval($_SESSION['id_users']);
$comision     = 0;
$date_added   = date("Y-m-d H:i:s");
$tipo_comp    = get_row('comprobantes', 'tipo_comp', 'id_comp', $id_comp);

/* Determinar estado según condiciones de pago */
$estado = ($condiciones == 98) ? 2 : 1;

/* Control de caja activa */
$id_caja = obtenerIdCajaActiva($conexion);

/* Validación de pago */
if ($resibido < $total_ft && $condiciones != 98) {
    mostrarErrorPagoInsuficiente();
    exit;
}

/* Generación de número de factura */
$comprobante  = obtenerComprobante($conexion, $id_comp);
$num_factura  = generarNumeroFactura($conexion, $comprobante, $id_comp, $sucursal_users);

if (!$num_factura || empty($num_factura['secuencial'])) {
    $errors[] = "Error al generar número de factura";
    displayErrors($errors);
    exit;
}

/* Registro de correlativo */
if (!registrarCorrelativo($conexion, $num_factura['secuencial'], $id_comp, $sucursal_users)) {
    $errors[] = "Error al registrar correlativo: " . mysqli_error($conexion);
    displayErrors($errors);
    exit;
}

/* INICIAR TRANSACCIÓN para evitar duplicados */
mysqli_begin_transaction($conexion);

try {

    /* Insertar factura principal PRIMERO para obtener el ID real */
    $factura_id = insertarFacturaVenta(
        $conexion,
        $num_factura['completo'],
        $date_added,
        $id_cliente,
        $id_vendedor,
        $condiciones,
        $total_ft,
        $estado,
        $users,
        $resibido,
        $sucursal_users,
        $id_comp,
        $id_mecanico,
        $id_empleado,
        $comision,
        $id_caja
    );

    if (!$factura_id) {
        throw new Exception("Error al insertar factura principal: " . mysqli_error($conexion));
    }

    /* Procesar productos de la cotización usando el ID REAL de la factura */
    $productos_procesados = procesarProductosCotizacion(
        $conexion,
        $numero_cotizacion,
        $factura_id,               // ID real
        $num_factura['completo'],  // número completo
        $sucursal_users,
        $users,
        $date_added
    );

    if (empty($productos_procesados['detalle_insertado'])) {
        throw new Exception("Error al insertar detalles de la factura");
    }

    /* Calcular cambio o saldo */
    if ($condiciones == 98) {

        $cambio = 0;
        $saldo_credito = $total_ft - $resibido;

        /**
         * ✅ CORREGIDO:
         * - Registrar crédito SIEMPRE (aunque $resibido sea 0)
         * - Guardar id_sucursal real en creditos y creditos_abonos
         */
        if (!registrarCreditoInicial(
            $conexion,
            $num_factura['completo'],
            $date_added,
            $id_cliente,
            $id_vendedor,
            $total_ft,
            $resibido,
            $saldo_credito,
            $users,
            $sucursal_users
        )) {
            throw new Exception("Error al registrar crédito/abono inicial: " . mysqli_error($conexion));
        }

    } else {
        $cambio = $resibido - $total_ft;
    }

    /* CONFIRMAR TRANSACCIÓN */
    mysqli_commit($conexion);

    /* ACTUALIZAR CAMPO PRINT_IMG EN LA COTIZACIÓN ORIGINAL */
    if (!actualizarPrintImgCotizacion($conexion, $numero_cotizacion)) {
        error_log("No se pudo actualizar print_img para cotización: $numero_cotizacion");
    }

    /* Configurar impresión según tipo de comprobante */
    $config_impresion = configurarImpresion($tipo_comp, $factura_id);

    /* Mostrar resultados */
    if ($condiciones == 98) {
        mostrarExitoCredito($simbolo_moneda, $resibido, $num_factura['completo']);
    } else {
        mostrarModalCambio(
            $num_factura['completo'],
            $simbolo_moneda,
            $cambio,
            $config_impresion['funcion'],
            $config_impresion['titulo']
        );
    }

} catch (Exception $e) {

    /* REVERTIR TRANSACCIÓN en caso de error */
    mysqli_rollback($conexion);
    $errors[] = $e->getMessage();
    displayErrors($errors);
}

/* =========================
   FUNCIONES AUXILIARES
   ========================= */

/**
 * Obtiene ID de caja activa
 */
function obtenerIdCajaActiva($conexion) {
    $caja_query = mysqli_query(
        $conexion,
        "SELECT caja_id
         FROM detalle_caja
         WHERE estado_caja = 0
         ORDER BY caja_id DESC
         LIMIT 1"
    );

    $caja_data = mysqli_fetch_array($caja_query);
    return $caja_data['caja_id'] ?? 0;
}

/**
 * Obtiene datos del comprobante
 */
function obtenerComprobante($conexion, $id_comp) {
    $sql = mysqli_query(
        $conexion,
        "SELECT serie_comp, desde_comp, hasta_comp, actual_comp, long_comp
         FROM comprobantes
         WHERE id_comp = '$id_comp'"
    );
    return mysqli_fetch_array($sql);
}

/**
 * Genera número de factura de forma segura
 */
function generarNumeroFactura($conexion, $comprobante, $id_comp, $sucursal) {
    if (!$comprobante) {
        return false;
    }

    // LOCK para evitar duplicados en correlativos
    mysqli_query($conexion, "LOCK TABLES correlativos WRITE");

    $rs = mysqli_query(
        $conexion,
        "SELECT MAX(num_fact) AS factura
         FROM correlativos
         WHERE tipo_fact = '$id_comp'
         AND sucursal_id = '$sucursal'"
    );

    $row = mysqli_fetch_array($rs);
    $numfactura = $row['factura'] ?? 0;

    // Verificar límite
    if (!empty($comprobante['hasta_comp']) && $comprobante['hasta_comp'] > 0 && ($numfactura + 1) > $comprobante['hasta_comp']) {
        mysqli_query($conexion, "UNLOCK TABLES");
        return false;
    }

    $secuencial = $numfactura + 1;

    $formato = str_pad($secuencial, $comprobante['long_comp'], "0", STR_PAD_LEFT);
    $completo = $comprobante['serie_comp'] . $formato;

    mysqli_query($conexion, "UNLOCK TABLES");

    return [
        'secuencial' => $secuencial,
        'completo'   => $completo
    ];
}

/**
 * Registra correlativo
 */
function registrarCorrelativo($conexion, $secuencial, $id_comp, $sucursal) {
    return mysqli_query(
        $conexion,
        "INSERT INTO correlativos (num_fact, tipo_fact, sucursal_id)
         VALUES ('$secuencial', '$id_comp', '$sucursal')"
    );
}

/**
 * Procesa productos de la cotización
 */
function procesarProductosCotizacion($conexion, $cotizacion, $id_factura, $factura_num, $sucursal, $users, $fecha) {

    $sumador_total   = 0;
    $total_impuesto  = 0;
    $detalle_insertado = true;

    // Eliminar registros del detalle de esta factura (por seguridad)
    mysqli_query(
        $conexion,
        "DELETE FROM detalle_fact_ventas
         WHERE id_factura = '$id_factura'"
    );

    $sql = mysqli_query(
        $conexion,
        "SELECT p.*, d.*
         FROM productos p
         INNER JOIN detalle_fact_cot d ON p.id_producto = d.id_producto
         WHERE d.numero_factura = '$cotizacion'"
    );

    if (!$sql || mysqli_num_rows($sql) == 0) {
        return [
            'subtotal'         => 0,
            'total_impuesto'   => 0,
            'detalle_insertado'=> false
        ];
    }

    while ($row = mysqli_fetch_array($sql)) {

        $id_producto    = $row['id_producto'];
        $cantidad       = $row['cantidad'];
        $desc_tmp       = $row['desc_venta'];
        $precio_venta   = $row['precio_venta'];
        $costo_producto = $row['costo_producto'];
        $iva_producto   = $row['iva_producto'];

        // Calcular precios
        $precio_venta_r = convertirANumero($precio_venta);
        $precio_total   = $precio_venta_r * $cantidad;
        $final_items    = rebajas($precio_total, $desc_tmp);

        // Subtotal
        $sumador_total += $final_items;

        // Impuestos
        if ($iva_producto == 1) {
            $iva_unitario = iva($precio_venta);
            $total_impuesto += rebajas($iva_unitario, $desc_tmp) * $cantidad;
        }

        // Verificar duplicado (extra)
        $check_exist = mysqli_query(
            $conexion,
            "SELECT id_detalle
             FROM detalle_fact_ventas
             WHERE id_factura = '$id_factura'
             AND id_producto = '$id_producto'
             LIMIT 1"
        );

        if (mysqli_num_rows($check_exist) > 0) {
            continue;
        }

        // Insertar detalle
        $insert_detail = mysqli_query(
            $conexion,
            "INSERT INTO detalle_fact_ventas (
                id_factura, numero_factura, id_producto,
                cantidad, desc_venta, precio_venta,
                importe_venta, sucursal_id
            ) VALUES (
                '$id_factura', '$factura_num', '$id_producto',
                '$cantidad', '$desc_tmp', '$precio_venta_r',
                '$precio_total', '$sucursal'
            )"
        );

        if (!$insert_detail) {
            $detalle_insertado = false;
            throw new Exception("Error al insertar detalle: " . mysqli_error($conexion));
        }

        // Kardex + stock
        actualizarKardexYStock($conexion, $id_producto, $cantidad, $costo_producto, $fecha, $users);
    }

    return [
        'subtotal'          => $sumador_total,
        'total_impuesto'    => $total_impuesto,
        'detalle_insertado' => $detalle_insertado
    ];
}

/**
 * Actualiza kardex y stock
 */
function actualizarKardexYStock($conexion, $id_producto, $cantidad, $costo, $fecha, $users) {

    $sql_kardex = mysqli_query(
        $conexion,
        "SELECT producto_kardex, costo_saldo, cant_saldo
         FROM kardex
         WHERE producto_kardex = '$id_producto'
         ORDER BY id_kardex DESC
         LIMIT 1"
    );

    if ($kardex = mysqli_fetch_array($sql_kardex)) {

        $cant_saldo  = $kardex['cant_saldo'] - $cantidad;
        $costo_saldo = $kardex['costo_saldo'];
        $saldo_total = $cantidad * $costo;
        $nuevo_saldo = $cant_saldo * $costo;

        guardar_salidas(
            $fecha, $id_producto, $cantidad, $costo, $saldo_total,
            $cant_saldo, $costo_saldo, $nuevo_saldo, $fecha, $users, 2
        );
    }

    $update = mysqli_query(
        $conexion,
        "UPDATE productos
         SET stock_producto = stock_producto - $cantidad
         WHERE id_producto = '$id_producto' AND inv_producto = 0"
    );

    return $update;
}

/**
 * ✅ CORREGIDO: Registra crédito y abono inicial (incluye id_sucursal)
 */
function registrarCreditoInicial($conexion, $factura, $fecha, $cliente, $vendedor, $total, $abono, $saldo, $users, $sucursal) {

    // Verificar que no exista ya este crédito
    $check = mysqli_query(
        $conexion,
        "SELECT id_credito FROM creditos WHERE numero_factura = '$factura' LIMIT 1"
    );

    if (mysqli_num_rows($check) > 0) {
        return true;
    }

    // Registrar crédito (con sucursal real)
    $credito = mysqli_query(
        $conexion,
        "INSERT INTO creditos (
            numero_factura, fecha_credito, id_cliente, id_vendedor,
            monto_credito, saldo_credito, estado_credito, id_users_credito, id_sucursal
        ) VALUES (
            '$factura', '$fecha', '$cliente', '$vendedor',
            '$total', '$saldo', '1', '$users', '$sucursal'
        )"
    );

    if (!$credito) {
        return false;
    }

    // Registrar abono inicial (con sucursal real)
    $concepto = ($abono > 0) ? 'ABONO INICIAL' : 'CRÉDITO INICIAL';

    $abono_inicial = mysqli_query(
        $conexion,
        "INSERT INTO creditos_abonos (
            numero_factura, fecha_abono, id_cliente,
            monto_abono, abono, saldo_abono,
            id_users_abono, id_sucursal, concepto_abono
        ) VALUES (
            '$factura', '$fecha', '$cliente',
            '$total', '$abono', '$saldo',
            '$users', '$sucursal', '$concepto'
        )"
    );

    return $abono_inicial ? true : false;
}

/**
 * Inserta factura de venta y retorna el ID
 */
function insertarFacturaVenta($conexion, $factura, $fecha, $cliente, $vendedor,
                             $condiciones, $total, $estado, $users, $recibido,
                             $sucursal, $comprobante, $mecanico, $empleado,
                             $comision, $caja) {

    $check = mysqli_query(
        $conexion,
        "SELECT id_factura FROM facturas_ventas
         WHERE numero_factura = '$factura'
         AND id_sucursal = '$sucursal'
         LIMIT 1"
    );

    if (mysqli_num_rows($check) > 0) {
        return false;
    }

    $insert = "INSERT INTO facturas_ventas (
        numero_factura, fecha_factura, id_cliente, id_vendedor,
        pago_codigo, monto_factura, estado_factura, id_users_factura,
        recibido, id_sucursal, id_comp_factura, num_trans_factura,
        mecanico_id, empleado_id, comision, control_caja
    ) VALUES (
        '$factura', '$fecha', '$cliente', '$vendedor',
        '$condiciones', '$total', '$estado', '$users',
        '$recibido', '$sucursal', '$comprobante', '0',
        '$mecanico', '$empleado', '$comision', '$caja'
    )";

    if ($conexion->query($insert) === true) {
        return $conexion->insert_id;
    }

    return false;
}

/**
 * Actualiza el campo print_img a 1 en la tabla facturas_cot
 */
function actualizarPrintImgCotizacion($conexion, $numero_cotizacion) {
    if (empty($numero_cotizacion)) {
        return false;
    }

    return mysqli_query(
        $conexion,
        "UPDATE facturas_cot
         SET print_img = 1
         WHERE numero_factura = '$numero_cotizacion'"
    );
}

/**
 * Configura función de impresión según tipo de comprobante
 */
function configurarImpresion($tipo_comp, $factura_id) {
    switch ($tipo_comp) {
        case 1:
            return ['funcion' => "printOrder('$factura_id')", 'titulo' => "Ticket"];
        case 2:
            return ['funcion' => "printFactura('$factura_id')", 'titulo' => "Consumidor Final"];
        default:
            return ['funcion' => "printFactura2('$factura_id')", 'titulo' => "Crédito Fiscal"];
    }
}

/**
 * Convierte string formateado a número
 */
function convertirANumero($valor) {
    $formateado = formato($valor);
    return (float) str_replace(",", "", $formateado);
}

/**
 * Muestra modal de cambio
 */
function mostrarModalCambio($factura, $moneda, $cambio, $funcion_impresion, $titulo_impresion) {
    $cambio_formateado = formato($cambio);
    ?>
    <script>
        $(document).ready(function() {
            $('#modal_vuelto').modal('show');
        });
    </script>

    <div class="modal fade" id="modal_vuelto" tabindex="-1" role="dialog">
        <div class="modal-dialog" role="document">
            <div class="modal-content">
                <div class="modal-header">
                    <button type="button" class="close" data-dismiss="modal" aria-label="Close">
                        <span aria-hidden="true">&times;</span>
                    </button>
                    <h4 class="modal-title">
                        <i class='fa fa-edit'></i> FACTURA: <?php echo htmlspecialchars($factura); ?>
                    </h4>
                </div>
                <div class="modal-body text-center">
                    <h3 class="text-bold">CAMBIO</h3>
                    <div class="alert alert-info">
                        <h1 class="text-bold">
                            <?php echo htmlspecialchars($moneda) . ' ' . htmlspecialchars($cambio_formateado); ?>
                        </h1>
                    </div>
                </div>
                <div class="modal-footer">
                    <button type="button"
                            id="imprimir"
                            class="btn btn-success btn-block btn-lg waves-effect waves-light"
                            onclick="<?php echo $funcion_impresion; ?>"
                            accesskey="t">
                        <span class="fa fa-print"></span>
                        <?php echo htmlspecialchars($titulo_impresion); ?>
                    </button>
                </div>
            </div>
        </div>
    </div>
    <?php
}

/**
 * Muestra éxito en crédito
 */
function mostrarExitoCredito($moneda, $recibido, $factura) {
    $recibido_formateado = formato($recibido);
    ?>
    <script>
        $(document).ready(function() {
            swal({
                title: 'VENTA AL CRÉDITO GUARDADA CON ÉXITO',
                text: 'Anticipo: <?php echo htmlspecialchars($moneda . ' ' . $recibido_formateado); ?>\nFactura: <?php echo htmlspecialchars($factura); ?>',
                type: 'success',
                confirmButtonText: 'Aceptar'
            });
        });
    </script>
    <?php
}

/**
 * Muestra error de pago insuficiente
 */
function mostrarErrorPagoInsuficiente() {
    ?>
    <script>
        $(document).ready(function() {
            swal({
                title: 'DINERO RECIBIDO ES MENOR AL MONTO TOTAL',
                text: 'Intentar Nuevamente',
                type: 'error',
                confirmButtonText: 'Aceptar'
            });
        });
    </script>
    <?php
}

/**
 * Muestra errores
 */
function displayErrors($errors) {
    if (!empty($errors)) {
        ?>
        <div class="alert alert-danger" role="alert">
            <strong>Error!</strong>
            <ul class="mb-0">
                <?php foreach ($errors as $error): ?>
                    <li><?php echo htmlspecialchars($error); ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
        <?php
    }
}

/**
 * Muestra mensajes de éxito
 */
function displayMessages($messages) {
    if (!empty($messages)) {
        ?>
        <div class="alert alert-success" role="alert">
            <strong>¡Operación Exitosa!</strong>
            <ul class="mb-0">
                <?php foreach ($messages as $message): ?>
                    <li><?php echo htmlspecialchars($message); ?></li>
                <?php endforeach; ?>
            </ul>
        </div>
        <?php
    }
}
?>