<?php
/**
 * SAC 2026 - BNC ANALYTICS ENGINE v1.0
 * Arquitecto: Andres Mathison
 * Objetivo: Procesamiento de estados de cuenta BNC en formato TXT.
 * Detección de comisiones (1.5% y 0.3%) y vinculación por últimos 8 dígitos.
 */
require_once 'config.php';

if (!isset($_SESSION['user_id'])) response(["error" => "No autorizado"], 401);

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['file'])) {
    $file = $_FILES['file'];
    $content = file_get_contents($file['tmp_name']);
    
    // El formato BNC TXT suele ser delimitado por tabuladores o espacios fijos, 
    // pero aquí implementaremos un motor flexible basado en líneas.
    $lines = explode("\n", $content);
    
    $movements = [];
    $summary = [];
    $metadata = ["account" => "BNC - S/A", "owner" => "S/A"];

    $cleanNum = function($str) {
        $str = trim($str);
        if (empty($str)) return 0.0;
        // BNC usa formato 1.234,56
        $str = str_replace(".", "", $str);
        $str = str_replace(",", ".", $str);
        return (float)$str;
    };

    // Motor de extracción BNC (Heurístico para TXT)
    foreach ($lines as $line) {
        $line = trim($line);
        if (empty($line)) continue;

        // Intentar detectar metadatos
        if (strpos($line, 'CUENTA:') !== false) {
            if (preg_match('/CUENTA:\s*(\d+)/', $line, $matches)) $metadata['account'] = $matches[1];
        }
        if (strpos($line, 'NOMBRE:') !== false) {
            if (preg_match('/NOMBRE:\s*(.+)/', $line, $matches)) $metadata['owner'] = trim($matches[1]);
        }

        // Detección de línea de movimiento (Fecha DD/MM/AAAA)
        if (preg_match('/^(\d{2}\/\d{2}\/\d{4})\s+(.+?)\s+(-?[\d\.,]+)\s+(-?[\d\.,]+)$/', $line, $matches)) {
            // Formato: Fecha | Descripción (incluye ref) | Monto | Saldo
            $date = $matches[1];
            $fullDesc = trim($matches[2]);
            $montoRaw = $matches[3];
            $saldoRaw = $matches[4];

            $monto = $cleanNum($montoRaw);
            $saldo = $cleanNum($saldoRaw);

            // Extraer referencia (BNC suele ponerla al final o en medio)
            $ref = "S/R";
            if (preg_match('/#(\d+)/', $fullDesc, $refMatches)) {
                $ref = $refMatches[1];
            } elseif (preg_match('/REF:\s*(\d+)/', $fullDesc, $refMatches)) {
                $ref = $refMatches[1];
            }

            $cat = ($monto > 0) ? 'INGRESOS' : 'EGRESOS';
            $subCat = 'VARIOS';

            if (strpos(strtoupper($fullDesc), 'COMISION') !== false) {
                $cat = 'COMISIONES';
                $subCat = 'BANCARIA';
            }

            $movements[] = [
                "date" => $date,
                "reference" => $ref,
                "description" => $fullDesc,
                "debit" => ($monto < 0) ? abs($monto) : 0,
                "credit" => ($monto > 0) ? $monto : 0,
                "balance" => $saldo,
                "category" => $cat,
                "subCategory" => $subCat
            ];
        }
    }

    // --- MOTOR DE VINCULACIÓN DE COMISIONES BNC (Kernel V4.1.44) ---
    // Regla 1: 1.5% para ingresos.
    // Regla 2: 0.3% para egresos.
    // Regla 3: Referencia igual o últimos 8 dígitos coinciden.
    
    $finalMovements = [];
    foreach ($movements as $m) {
        if ($m['category'] === 'COMISIONES') {
            $finalMovements[] = $m;
            continue;
        }

        $hasComm = false;
        $montoAbs = ($m['credit'] > 0) ? $m['credit'] : $m['debit'];
        $expectedComm = ($m['category'] === 'INGRESOS') ? round($montoAbs * 0.015, 2) : round($montoAbs * 0.003, 2);
        
        foreach ($movements as $other) {
            if ($other['category'] !== 'COMISIONES') continue;
            
            $otherMonto = abs($other['debit'] + $other['credit']);
            
            // Verificación por referencia (últimos 8 dígitos)
            $ref1 = $m['reference'];
            $ref2 = $other['reference'];
            $refMatch = ($ref1 === $ref2) || (strlen($ref1) >= 8 && strlen($ref2) >= 8 && substr($ref1, -8) === substr($ref2, -8));
            
            // Verificación por monto (tolerancia de 0.01 por redondeo)
            $montoMatch = abs($otherMonto - $expectedComm) < 0.02;

            if ($refMatch && $montoMatch) {
                $hasComm = true;
                break;
            }
        }
        
        $m['hasMissingCommission'] = !$hasComm;
        $finalMovements[] = $m;
    }

    // Resumen
    foreach ($finalMovements as $m) {
        $key = $m['category'];
        if (!isset($summary[$key])) $summary[$key] = ["count" => 0, "total" => 0, "label" => $key];
        $summary[$key]["count"]++;
        $summary[$key]["total"] += ($m['credit'] > 0) ? $m['credit'] : $m['debit'];
    }

    response([
        "success" => true,
        "metadata" => $metadata,
        "summary" => array_values($summary),
        "movements" => $finalMovements
    ]);

} else {
    response(["error" => "No file"], 400);
}
?>