import { Response } from 'express';
import { isValidIBAN } from 'ibantools';
import * as blzData from '../services/blzData.service.js';
import { ApiResponse, AuthRequest } from '../types/index.js';

/**
 * IBAN-Lookup: prüft die Prüfziffer (mod-97, offline über ibantools) und liefert
 * – für deutsche IBANs – BIC und Banknamen aus der Bundesbank-Bankleitzahlen-
 * datei (offline; siehe blzData.service – Volume-Datensatz bevorzugt, sonst die
 * ins Image gebackenen Daten). Die IBAN verlässt NICHT den Server; es findet
 * KEIN externer Request statt. Zurückgegeben werden nur öffentliche
 * Bankverzeichnis-Daten (BIC/Name), keine kundenbezogenen Informationen.
 *
 * Antwortformen (immer HTTP 200, sofern eine IBAN übergeben wurde):
 *   { valid: false }                                  → Prüfziffer falsch (Tippfehler)
 *   { valid: true, bic, bankName, blz }               → gültig + DE-Bank gefunden
 *   { valid: true, bic: null, bankName: null }        → gültig, aber keine DE-Bankdaten
 *                                                        (Nicht-DE-IBAN oder unbekannte BLZ)
 */
export async function lookupIban(req: AuthRequest, res: Response): Promise<void> {
  try {
    const raw = typeof req.body?.iban === 'string' ? req.body.iban : '';
    const iban = raw.replace(/\s+/g, '').toUpperCase();

    if (!iban) {
      res.status(400).json({ success: false, error: 'Feld IBAN ist erforderlich.' } as ApiResponse);
      return;
    }

    if (!isValidIBAN(iban)) {
      res.json({ success: true, data: { valid: false, iban } } as ApiResponse);
      return;
    }

    const country = iban.slice(0, 2);
    const bank = country === 'DE' ? blzData.lookupByIban(iban) : null;

    res.json({
      success: true,
      data: {
        valid: true,
        iban,
        country,
        bic: bank?.bic ?? null,
        bankName: bank?.bankName ?? null,
        blz: bank?.blz ?? null,
      },
    } as ApiResponse);
  } catch (error) {
    res.status(500).json({
      success: false,
      error: error instanceof Error ? error.message : 'Fehler beim IBAN-Nachschlagen',
    } as ApiResponse);
  }
}
