<?php
/**
 * SAC 2026 - GET BANK PRECISE MOVEMENTS v1.0
 * Kernel V4.2.02: Consolidated view of bank movements matching bank statements.
 * Este archivo agrupa las transacciones por referencia bancaria para evitar la fragmentación
 * que ocurre cuando un solo depósito cubre múltiples cuotas o meses.
 */
require_once 'config.php';

// Verificación de sesión
if (!isset($_SESSION['user_id'])) response(["error" => "No autorizado"], 401);

// Parámetros de filtrado
$month = isset($_GET['month']) ? (int)$_GET['month'] : null;
$year = isset($_GET['year']) ? (int)$_GET['year'] : null;

if (!$month || !$year) {
    response(["error" => "Mes y año requeridos para el filtrado preciso"], 400);
}

try {
    // Definimos el rango de fechas para el mes solicitado
    $startDate = sprintf("%04d-%02d-01", $year, $month);
    $endDate = date("Y-m-t", strtotime($startDate));

    /**
     * LÓGICA DE AGRUPACIÓN NUCLEAR:
     * Agrupamos por fecha, referencia y tipo (Ingreso/Egreso).
     * Los movimientos sin referencia se mantienen individuales usando su ID en la agrupación.
     */
    $query = "
        SELECT 
            MIN(id) as id,
            date,
            GROUP_CONCAT(DISTINCT description SEPARATOR ' + ') as description,
            SUM(amount_bs) as amountBs,
            SUM(amount_usd) as amount,
            type,
            category,
            reference
        FROM bank_transactions 
        WHERE date BETWEEN ? AND ?
        GROUP BY 
            date, 
            CASE WHEN reference IS NULL OR reference = '' OR reference = 'S/R' THEN CAST(id AS CHAR) ELSE reference END,
            type
        ORDER BY date DESC, id DESC
    ";

    $stmt = $pdo->prepare($query);
    $stmt->execute([$startDate, $endDate]);
    $transactions = $stmt->fetchAll();

    // Log de auditoría para el nuevo módulo
    logSystemAction("CONSULTA BANCO PRECISO: $month/$year", "BANCO_PRE_V4");

    response([
        "success" => true,
        "transactions" => $transactions,
        "kernel" => "V4.2.02"
    ]);

} catch (Exception $e) {
    response(["error" => "Fallo en motor de Banco Preciso: " . $e->getMessage()], 500);
}
?>