<?php
// profile/update-bank.php
// Actualiza banco_idbanco y nocuenta del distribuidor, previa verificación de código.
// Registra el cambio en la tabla audit_cambios para historial.
declare(strict_types=1);
require_once dirname(__FILE__) . '/../config.php';

if ($_SERVER['REQUEST_METHOD'] !== 'POST') { jsonErr(405, 'Metodo no permitido.'); }
$jwt   = auth();
$idinv = (int)$jwt['idinv'];
$b     = body();
$db    = getDB();

$codigo   = trim($b['codigo'] ?? '');
$banco_id = isset($b['banco_idbanco']) ? (int)$b['banco_idbanco'] : null;
$nocuenta = isset($b['nocuenta']) ? trim($b['nocuenta']) : null;

if (!$codigo) { jsonErr(400, 'Se requiere el código de verificación.'); }

// Validar código (tipo = 'banco')
$stmt = $db->prepare("SELECT codigo, expira FROM verify_codes WHERE id_inver = ? AND tipo = 'banco' LIMIT 1");
$stmt->execute([$idinv]);
$vc = $stmt->fetch();

if (!$vc) { jsonErr(400, 'No se encontró un código de verificación. Solicita uno nuevo.'); }
if (new DateTime() > new DateTime($vc['expira'])) {
    jsonErr(400, 'El código ha expirado. Solicita uno nuevo.');
}
if ($vc['codigo'] !== $codigo) {
    jsonErr(400, 'Código incorrecto. Verifica e intenta de nuevo.');
}

// Crear tabla de auditoría si no existe
$db->exec("CREATE TABLE IF NOT EXISTS audit_cambios (
    id          INT UNSIGNED NOT NULL AUTO_INCREMENT,
    id_inver    INT NOT NULL,
    tipo        VARCHAR(30) NOT NULL COMMENT 'banco | contacto',
    campo       VARCHAR(50) NOT NULL,
    valor_ant   TEXT,
    valor_nuevo TEXT,
    ip          VARCHAR(45),
    fecha       DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP,
    PRIMARY KEY (id),
    KEY idx_inver_tipo (id_inver, tipo),
    KEY idx_fecha (fecha)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4");

// Obtener valores actuales para auditoría
$cur = $db->prepare('SELECT banco_idbanco, nocuenta FROM inversionista WHERE id_inver = ? LIMIT 1');
$cur->execute([$idinv]);
$anterior = $cur->fetch();

// Construir UPDATE
$sets   = [];
$params = [];

if ($banco_id !== null) {
    $chk = $db->prepare('SELECT idbanco, nombre FROM banco WHERE idbanco = ? LIMIT 1');
    $chk->execute([$banco_id]);
    $bancoRow = $chk->fetch();
    if (!$bancoRow) { jsonErr(400, 'El banco seleccionado no es válido.'); }
    $sets[]   = 'banco_idbanco = ?';
    $params[] = $banco_id;
}

if ($nocuenta !== null) {
    $sets[]   = 'nocuenta = ?';
    $params[] = $nocuenta;
}

if (empty($sets)) { jsonErr(400, 'No hay campos bancarios para actualizar.'); }

$params[] = $idinv;
$db->prepare('UPDATE inversionista SET ' . implode(', ', $sets) . ' WHERE id_inver = ?')
   ->execute($params);

// Registrar auditoría
$ip   = $_SERVER['REMOTE_ADDR'] ?? null;
$ins  = $db->prepare(
    "INSERT INTO audit_cambios (id_inver, tipo, campo, valor_ant, valor_nuevo, ip) VALUES (?, 'banco', ?, ?, ?, ?)"
);

if ($banco_id !== null && (int)($anterior['banco_idbanco'] ?? 0) !== $banco_id) {
    // Obtener nombre del banco anterior
    $bAnt = $db->prepare('SELECT nombre FROM banco WHERE idbanco = ? LIMIT 1');
    $bAnt->execute([(int)($anterior['banco_idbanco'] ?? 0)]);
    $bAntRow = $bAnt->fetch();
    $ins->execute([
        $idinv,
        'banco',
        $bAntRow ? $bAntRow['nombre'] : (string)($anterior['banco_idbanco'] ?? ''),
        $bancoRow['nombre'],
        $ip,
    ]);
}

if ($nocuenta !== null && ($anterior['nocuenta'] ?? '') !== $nocuenta) {
    $ins->execute([
        $idinv,
        'nocuenta',
        $anterior['nocuenta'] ?? '',
        $nocuenta,
        $ip,
    ]);
}

// Eliminar el código usado (tipo = 'banco')
$db->prepare("DELETE FROM verify_codes WHERE id_inver = ? AND tipo = 'banco'")->execute([$idinv]);

jsonOk(['mensaje' => 'Datos bancarios actualizados correctamente.']);
