<?php
// bancos/conciliacion_bancos.php

session_start();
include '../includes/session_control.php';

require_once __DIR__ . '/../cotizaciones/api/_node.php';
require_once __DIR__ . '/../includes/user_activity_log.php';

// ──────────────────────────────────────────────────
// 1) Recoger parámetros y operaciones CRUD
// ──────────────────────────────────────────────────
$idBanco    = intval($_GET['idBanco'] ?? 0);
$action     = $_REQUEST['action'] ?? '';
$filterTipo = $_GET['filter_tipo'] ?? ''; // 'ingreso' o 'gasto'
$filterMes  = intval($_GET['filter_mes'] ?? 0);

$message = '';
$nodeBase = cpn_node_api_base();
$token = $_SESSION['node_token'] ?? '';
$hasToken = is_string($token) && trim($token) !== '';

function cpn_set_and_redirect(string $msg, int $idBanco, string $filterTipo, int $filterMes): void
{
    $_SESSION['flash_message'] = $msg;
    header("Location: conciliacion_bancos.php?idBanco={$idBanco}&filter_tipo={$filterTipo}&filter_mes={$filterMes}");
    exit;
}

// ──────────────────────────────────────────────────
// 1.B) Eliminar una conciliación completa
// ──────────────────────────────────────────────────
if ($action === 'delete' && isset($_GET['id'])) {
    $idConc = intval($_GET['id']);

    if (!$hasToken) {
        cpn_set_and_redirect('Token de sesión no disponible. Vuelva a iniciar sesión.', $idBanco, $filterTipo, $filterMes);
    }

    $resp = cpn_node_request('POST', $nodeBase . '/api/bancos/conciliacion/delete', $token, [
        'idBanco' => $idBanco,
        'idConciliacion' => $idConc,
    ]);

    if (!($resp['ok'] ?? false)) {
        $errMsg = $resp['error']['message'] ?? 'Error eliminando conciliación.';
        cpn_set_and_redirect((string)$errMsg, $idBanco, $filterTipo, $filterMes);
    }

    cpn_activity_log_event(
        'Bancos',
        'bancos.conciliacion_delete',
        'Eliminó conciliación bancaria #' . $idConc,
        'conciliacion_banco',
        $idConc,
        ['idBanco' => $idBanco]
    );

    header("Location: conciliacion_bancos.php?idBanco={$idBanco}&filter_tipo={$filterTipo}&filter_mes={$filterMes}");
    exit;
}

// ──────────────────────────────────────────────────
// 1.C) Limpiar idTipoConciliacion e idReferencia
// ──────────────────────────────────────────────────
if ($action === 'clear' && isset($_GET['id'])) {
    $idConc = intval($_GET['id']);

    if (!$hasToken) {
        cpn_set_and_redirect('Token de sesión no disponible. Vuelva a iniciar sesión.', $idBanco, $filterTipo, $filterMes);
    }

    $resp = cpn_node_request('POST', $nodeBase . '/api/bancos/conciliacion/clear', $token, [
        'idBanco' => $idBanco,
        'idConciliacion' => $idConc,
    ]);

    if (!($resp['ok'] ?? false)) {
        $errMsg = $resp['error']['message'] ?? 'Error desvinculando conciliación.';
        cpn_set_and_redirect((string)$errMsg, $idBanco, $filterTipo, $filterMes);
    }

    cpn_activity_log_event(
        'Bancos',
        'bancos.conciliacion_clear',
        'Desvinculó conciliación bancaria #' . $idConc,
        'conciliacion_banco',
        $idConc,
        ['idBanco' => $idBanco]
    );

    header("Location: conciliacion_bancos.php?idBanco={$idBanco}&filter_tipo={$filterTipo}&filter_mes={$filterMes}");
    exit;
}

// ──────────────────────────────────────────────────
// 1.D) Insertar nueva fila en tb_conciliacion_bancos
// ──────────────────────────────────────────────────
if ($action === 'add' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $fecha = trim((string)($_POST['fecha'] ?? ''));
    $descripcion = trim((string)($_POST['descripcion'] ?? ''));
    $valor = floatval($_POST['valor'] ?? 0);

    if (!$hasToken) {
        cpn_set_and_redirect('Token de sesión no disponible. Vuelva a iniciar sesión.', $idBanco, $filterTipo, $filterMes);
    }

    $resp = cpn_node_request('POST', $nodeBase . '/api/bancos/conciliacion/add', $token, [
        'idBanco' => $idBanco,
        'fecha' => $fecha,
        'descripcion' => $descripcion,
        'valor' => $valor,
    ]);

    if (!($resp['ok'] ?? false)) {
        $errMsg = $resp['error']['message'] ?? 'Error creando movimiento.';
        cpn_set_and_redirect((string)$errMsg, $idBanco, $filterTipo, $filterMes);
    }

    cpn_activity_log_event(
        'Bancos',
        'bancos.conciliacion_add',
        'Creó movimiento de conciliación (banco #' . $idBanco . ')',
        'banco',
        $idBanco,
        ['fecha' => $fecha, 'valor' => $valor]
    );

    header("Location: conciliacion_bancos.php?idBanco={$idBanco}&filter_tipo={$filterTipo}&filter_mes={$filterMes}");
    exit;
}

// ──────────────────────────────────────────────────
// 1.E) Enlazar un movimiento (drag & drop) con una conciliación existente
// ──────────────────────────────────────────────────
if ($action === 'link' && $_SERVER['REQUEST_METHOD'] === 'POST') {
    $idConciliacion   = intval($_POST['idConciliacion'] ?? 0);
    $idMovimiento     = intval($_POST['idMovimiento'] ?? 0);
    $idTipoMovimiento = intval($_POST['idTipoMovimiento'] ?? 0);
    $idBancoPost      = intval($_POST['idBanco'] ?? 0);
    $idBancoLink      = $idBancoPost > 0 ? $idBancoPost : $idBanco;

    header('Content-Type: application/json');

    if (!$hasToken) {
        echo json_encode(['success' => false, 'error' => 'Token de sesión no disponible.']);
        exit;
    }

    $resp = cpn_node_request('POST', $nodeBase . '/api/bancos/conciliacion/link', $token, [
        'idBanco' => $idBancoLink,
        'idConciliacion' => $idConciliacion,
        'idMovimiento' => $idMovimiento,
        'idTipoMovimiento' => $idTipoMovimiento,
    ]);

    if (($resp['ok'] ?? false) === true) {
        cpn_activity_log_event(
            'Bancos',
            'bancos.conciliacion_link',
            'Vinculó movimiento a conciliación (conciliación #' . $idConciliacion . ')',
            'conciliacion_banco',
            $idConciliacion,
            ['idBanco' => $idBancoLink, 'idMovimiento' => $idMovimiento, 'idTipoMovimiento' => $idTipoMovimiento]
        );
    }

    echo json_encode(['success' => (bool)($resp['ok'] ?? false)]);
    exit;
}

// Flash message (si viene de redirect)
if (isset($_SESSION['flash_message'])) {
    $message = (string)$_SESSION['flash_message'];
    unset($_SESSION['flash_message']);
}

$bancos = [];
$bancoNombre = '';
$saldoInicial = 0;
$saldoBanco = 0;
$saldoSistema = 0;
$diferencia = 0;
$movPendienteCount = 0;
$leftRows = [];
$rightRows = [];

if ($hasToken) {
    if ($idBanco > 0) {
        $qs = http_build_query([
            'idBanco' => $idBanco,
            'filter_tipo' => $filterTipo,
            'filter_mes' => $filterMes,
        ]);
        $resp = cpn_node_request('GET', $nodeBase . '/api/bancos/conciliacion/view?' . $qs, $token);
        if (($resp['ok'] ?? false) && is_array($resp['data'] ?? null)) {
            $data = $resp['data'];
            $bancos = is_array($data['bancos'] ?? null) ? $data['bancos'] : [];
            $bancoNombre = (string)($data['banco']['nombre'] ?? '');
            $saldoInicial = floatval($data['banco']['saldoInicial'] ?? 0);
            $saldoBanco = floatval($data['saldos']['saldoBanco'] ?? 0);
            $saldoSistema = floatval($data['saldos']['saldoSistema'] ?? 0);
            $diferencia = floatval($data['saldos']['diferencia'] ?? 0);
            $movPendienteCount = intval($data['saldos']['movPendienteCount'] ?? 0);
            $leftRows = is_array($data['leftRows'] ?? null) ? $data['leftRows'] : [];
            $rightRows = is_array($data['rightRows'] ?? null) ? $data['rightRows'] : [];
        } else {
            $message = $message ?: ((string)($resp['error']['message'] ?? 'No se pudo cargar la conciliación.'));
        }
    } else {
        $resp = cpn_node_request('GET', $nodeBase . '/api/bancos/conciliacion/bancos', $token);
        if (($resp['ok'] ?? false) && is_array($resp['data'] ?? null)) {
            $bancos = $resp['data'];
        } else {
            $message = $message ?: ((string)($resp['error']['message'] ?? 'No se pudo cargar la lista de bancos.'));
        }
    }
} else {
    $message = $message ?: 'Token de sesión no disponible. Vuelva a iniciar sesión.';
}

?>
<?php include '../templates/header.php'; ?>

<div class="container-fluid my-4">

    <?php if ($message !== ''): ?>
        <div class="alert alert-info"><?= htmlspecialchars($message, ENT_QUOTES, 'UTF-8') ?></div>
    <?php endif; ?>

    <!-- ──────────────────────────────────────── -->
    <!-- 1) Seleccionar Banco a Conciliar         -->
    <!-- ──────────────────────────────────────── -->
    <!-- FORM 1: solo para seleccionar banco -->
    <form class="row g-2 mb-4" method="GET" action="conciliacion_bancos.php">
        <div class="col-auto">
            <label for="select-banco" class="form-label">Seleccione el banco a conciliar:</label>
            <select
                id="select-banco"
                name="idBanco"
                class="form-select"
                onchange="this.form.submit()">
                <option value="">-- Elegir banco --</option>
                <?php foreach ($bancos as $b): ?>
                    <option
                        value="<?= $b['id'] ?>"
                        <?= $b['id'] === $idBanco ? 'selected' : '' ?>>
                        <?= htmlspecialchars($b['nombre'], ENT_QUOTES, 'UTF-8') ?>
                    </option>
                <?php endforeach; ?>
            </select>
        </div>
    </form>

    <?php if ($idBanco === 0): ?>
        <!-- Sin banco seleccionado -->
        <div class="alert alert-info">Por favor, elija un banco para comenzar la conciliación.</div>
        <?php include '../templates/footer.php';
        exit; ?>
    <?php endif; ?>

    <!-- ──────────────────────────────────────── -->
    <!-- 2) Título con nombre del banco           -->
    <!-- ──────────────────────────────────────── -->
    <h3 class="mb-4">Conciliación de: <?= htmlspecialchars($bancoNombre, ENT_QUOTES, 'UTF-8') ?></h3>

    <!-- ──────────────────────────────────────── -->
    <!-- 3) Filtros: Tipo y Mes (mantienen idBanco) -->
    <!-- ──────────────────────────────────────── -->
    <form class="row g-2 mb-4" method="GET" action="conciliacion_bancos.php">
        <input type="hidden" name="idBanco" value="<?= $idBanco ?>">
        <div class="col-auto">
            <label for="filter-tipo" class="form-label">Tipo Movimiento:</label>
            <select
                id="filter-tipo"
                name="filter_tipo"
                class="form-select"
                onchange="this.form.submit()">
                <option value="">Todos</option>
                <option value="ingreso" <?= $filterTipo === 'ingreso' ? 'selected' : '' ?>>Ingreso (> 0)</option>
                <option value="gasto" <?= $filterTipo === 'gasto'   ? 'selected' : '' ?>>Gasto (< 0)</option>
            </select>
        </div>
        <div class="col-auto">
            <label for="filter-mes" class="form-label">Mes:</label>
            <select
                id="filter-mes"
                name="filter_mes"
                class="form-select"
                onchange="this.form.submit()">
                <option value="0">-- Todos --</option>
                <?php for ($m = 1; $m <= 12; $m++): ?>
                    <?php $mesNombre = DateTime::createFromFormat('!m', $m)->format('M'); ?>
                    <option
                        value="<?= $m ?>"
                        <?= $filterMes === $m ? 'selected' : '' ?>>
                        <?= $mesNombre ?>
                    </option>
                <?php endfor; ?>
            </select>
        </div>
    </form>

    <!-- ──────────────────────────────────────── -->
    <!-- 4) Mostrar Saldos y Pendientes en una fila -->
    <!-- ──────────────────────────────────────── -->
    <div class="row mb-4">
        <div class="col-md-3">
            <div class="card border-primary h-100">
                <div class="card-body p-2 text-center">
                    <h6 class="card-title mb-1">Saldo Banco</h6>
                    <p class="card-text fw-bold">$<?= number_format($saldoBanco, 0, '', '.') ?></p>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card border-success h-100">
                <div class="card-body p-2 text-center">
                    <h6 class="card-title mb-1">Saldo Sistema</h6>
                    <p class="card-text fw-bold">$<?= number_format($saldoSistema, 0, '', '.') ?></p>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card border-danger h-100">
                <div class="card-body p-2 text-center">
                    <h6 class="card-title mb-1">Diferencia</h6>
                    <p class="card-text fw-bold">$<?= number_format($diferencia, 0, '', '.') ?></p>
                </div>
            </div>
        </div>
        <div class="col-md-3">
            <div class="card border-warning h-100">
                <div class="card-body p-2 text-center">
                    <h6 class="card-title mb-1">Mov. por Conciliar</h6>
                    <p class="card-text fw-bold"><?= $movPendienteCount ?></p>
                </div>
            </div>
        </div>
    </div>

    <div class="row">
        <!-- ──────────────────────────────────────────────────── -->
        <!-- 5) Left Table: Movimientos Banco (Conciliaciones)    -->
        <!-- ──────────────────────────────────────────────────── -->
        <div class="col-md-6">
            <h5 class="mb-2">Movimientos Banco</h5>
            <div class="table-responsive">
                <table class="table table-sm table-bordered align-middle small" style="font-size: 0.8rem; width: 100%;">
                    <thead class="table-light">
                        <tr>
                            <th class="text-center">X</th>
                            <th>ID</th>
                            <th>Fecha</th>
                            <th>Descripción</th>
                            <th class="text-right">Valor</th>
                            <th class="text-center">Mov.</th>
                            <th class="text-center">Ref</th>
                            <th class="text-center">Desv</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($leftRows as $lr): ?>
                            <?php
                            $isConciliadoLeft = $lr['idTipoConciliacion'] !== null || $lr['idReferencia'] !== null;
                            ?>
                            <tr
                                data-conciliacion-id="<?= $lr['id'] ?>"
                                class="droppable <?= $isConciliadoLeft ? 'table-secondary' : '' ?>">
                                <td class="text-center align-middle p-1">
                                    <a
                                        href="conciliacion_bancos.php?idBanco=<?= $idBanco ?>&action=delete&id=<?= $lr['id'] ?>&filter_tipo=<?= $filterTipo ?>&filter_mes=<?= $filterMes ?>"
                                        class="text-danger small"
                                        onclick="return confirm('¿Eliminar este registro?');">
                                        &times;
                                    </a>
                                </td>
                                <td class="align-middle p-1"><?= $lr['id'] ?></td>
                                <td class="align-middle p-1"><?= date('d-M-y', strtotime($lr['fecha'])) ?></td>
                                <td class="align-middle p-1"><?= htmlspecialchars($lr['descripcion'], ENT_QUOTES, 'UTF-8') ?></td>
                                <td class="text-right align-middle p-1">$<?= number_format($lr['valor'], 0, '', '.') ?></td>
                                <td class="text-center align-middle p-1">
                                    <?= $lr['idTipoConciliacion'] !== null ? htmlspecialchars($lr['idTipoConciliacion'], ENT_QUOTES, 'UTF-8') : '-' ?>
                                </td>
                                <td class="text-center align-middle p-1">
                                    <?= $lr['idReferencia'] !== null ? htmlspecialchars($lr['idReferencia'], ENT_QUOTES, 'UTF-8') : '-' ?>
                                </td>
                                <td class="text-center align-middle p-1">
                                    <?php if ($isConciliadoLeft): ?>
                                        <a
                                            href="conciliacion_bancos.php?idBanco=<?= $idBanco ?>&action=clear&id=<?= $lr['id'] ?>&filter_tipo=<?= $filterTipo ?>&filter_mes=<?= $filterMes ?>"
                                            class="text-warning small"
                                            title="Desvincular movimiento">
                                            &times;
                                        </a>
                                    <?php else: ?>
                                        &ndash;
                                    <?php endif; ?>
                                </td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>

            <!-- Formulario de inserción de nueva fila -->
            <div class="mt-3">
                <h6 class="mb-1">Agregar nuevo movimiento:</h6>
                <form method="POST" action="conciliacion_bancos.php?idBanco=<?= $idBanco ?>&filter_tipo=<?= $filterTipo ?>&filter_mes=<?= $filterMes ?>">
                    <input type="hidden" name="action" value="add">
                    <div class="row g-2">
                        <div class="col-4">
                            <label for="fecha" class="form-label small">Fecha:</label>
                            <input type="date" id="fecha" name="fecha" class="form-control form-control-sm" required value="<?= date('Y-m-d') ?>">
                        </div>
                        <div class="col-5">
                            <label for="descripcion" class="form-label small">Descripción:</label>
                            <input type="text" id="descripcion" name="descripcion" class="form-control form-control-sm" required>
                        </div>
                        <div class="col-3">
                            <label for="valor" class="form-label small">Valor:</label>
                            <input type="number" step="0.01" id="valor" name="valor" class="form-control form-control-sm text-right" required>
                        </div>
                    </div>
                    <div class="mt-2">
                        <button type="submit" class="btn btn-success btn-sm">Insertar</button>
                    </div>
                </form>
            </div>

            <!-- Botón para "Agregar Gastos bancarios seleccionados" (modal pendiente) -->
            <div class="mt-3">
                <button id="btn-add-selected" class="btn btn-primary btn-sm" disabled>
                    Agregar Gastos bancarios seleccionados
                </button>
                <!-- Modal pendiente para asignar tipo de gasto -->
            </div>
        </div>

        <!-- ──────────────────────────────────────────────────── -->
        <!-- 5) Right Table: Movimientos Sistema (drag & drop)   -->
        <!-- ──────────────────────────────────────────────────── -->
        <div class="col-md-6">
            <h5 class="mb-2">Movimientos Sistema</h5>
            <div class="table-responsive">
                <table class="table table-sm table-bordered align-middle small" style="font-size: 0.8rem; width: 100%;">
                    <thead class="table-light">
                        <tr>
                            <th>ID</th>
                            <th>Fecha</th>
                            <th>Concepto</th>
                            <th class="text-right">Valor</th>
                            <th class="text-center">Mov</th>
                            <th class="text-center">Conc</th>
                        </tr>
                    </thead>
                    <tbody>
                        <?php foreach ($rightRows as $rr): ?>
                            <?php
                            $isConciliadoRight = $rr['concId'] !== null;
                            $rowClass          = $isConciliadoRight ? 'table-secondary' : 'draggable';
                            ?>
                            <tr
                                data-mov-id="<?= $rr['movId'] ?>"
                                data-tipo-mov="<?= $rr['idTipoMovimiento'] ?>"
                                class="<?= $rowClass ?>"
                                <?= $isConciliadoRight ? '' : 'draggable="true"' ?>
                                <?= $isConciliadoRight ? '' : 'ondragstart="dragStart(event)"' ?>>
                                <td class="align-middle p-1"><?= $rr['movId'] ?></td>
                                <td class="align-middle p-1"><?= date('d-M-y', strtotime($rr['fecha'])) ?></td>
                                <td class="align-middle p-1"><?= htmlspecialchars($rr['concepto'], ENT_QUOTES, 'UTF-8') ?></td>
                                <td class="text-right align-middle p-1">$<?= number_format($rr['valor'], 0, '', '.') ?></td>
                                <td class="text-center align-middle p-1"><?= htmlspecialchars($rr['idTipoMovimiento'], ENT_QUOTES, 'UTF-8') ?></td>
                                <td class="text-center align-middle p-1"><?= $isConciliadoRight ? '✔' : '' ?></td>
                            </tr>
                        <?php endforeach; ?>
                    </tbody>
                </table>
            </div>
        </div>
    </div>
</div>

<?php include '../templates/footer.php'; ?>

<script>
    // Select2 (modo oscuro)
    $(function() {
        $('#select-banco').select2({
            width: 'resolve'
        });
        $('#filter-tipo').select2({
            width: 'resolve',
            minimumResultsForSearch: Infinity
        });
        $('#filter-mes').select2({
            width: 'resolve',
            minimumResultsForSearch: Infinity
        });
    });

    // ──────────────────────────────────────────────────
    // JavaScript: Drag & Drop para enlazar movimientos
    // ──────────────────────────────────────────────────

    let draggedMovId = null;
    let draggedTipoMov = null;
    const currentBancoId = <?= (int)$idBanco ?>;

    function dragStart(e) {
        const tr = e.target.closest('tr');
        draggedMovId = tr.getAttribute('data-mov-id');
        draggedTipoMov = tr.getAttribute('data-tipo-mov');
        e.dataTransfer.setData('text/plain', draggedMovId);
    }

    document.querySelectorAll('.droppable').forEach(cell => {
        cell.addEventListener('dragover', function(e) {
            e.preventDefault();
            this.style.backgroundColor = '#f0f8ff';
        });
        cell.addEventListener('dragleave', function() {
            this.style.backgroundColor = '';
        });
        cell.addEventListener('drop', function(e) {
            e.preventDefault();
            this.style.backgroundColor = '';
            const concId = this.getAttribute('data-conciliacion-id');
            fetch('conciliacion_bancos.php', {
                    method: 'POST',
                    headers: {
                        'Content-Type': 'application/x-www-form-urlencoded'
                    },
                    body: new URLSearchParams({
                        action: 'link',
                        idBanco: currentBancoId,
                        idConciliacion: concId,
                        idMovimiento: draggedMovId,
                        idTipoMovimiento: draggedTipoMov
                    })
                })
                .then(res => res.json())
                .then(js => {
                    if (js.success) {
                        location.reload();
                    } else {
                        alert('Error al enlazar movimiento.');
                    }
                });
        });
    });
</script>