// Hilfs-Funktionen für ComposeEmailModal und die zwei neuen Modals
// (Vertragsdokumente anhängen, Kundendaten einfügen).

import { fileUrl } from '../../utils/fileUrl';
import type { EmailAttachment } from '../../services/api';

/**
 * Holt eine Server-Datei (per fileUrl mit Token) und gibt sie als
 * EmailAttachment zurück. Wird sowohl für ContractDocuments als auch
 * für BankCard- und IdentityDocument-PDFs benutzt.
 *
 * Wirft mit aussagekräftiger Message, wenn der Download fehlschlägt –
 * der Caller fängt das ab und zeigt einen Toast.
 */
export async function serverFileToAttachment(
  documentPath: string,
  filename: string,
): Promise<EmailAttachment> {
  const url = fileUrl(documentPath);
  if (!url) throw new Error(`Datei "${filename}" hat keinen Pfad.`);
  const response = await fetch(url);
  if (!response.ok) {
    throw new Error(
      `Download von "${filename}" fehlgeschlagen (HTTP ${response.status}).`,
    );
  }
  const blob = await response.blob();
  const base64 = await blobToBase64(blob);
  return {
    filename,
    content: base64,
    contentType: blob.type || 'application/octet-stream',
  };
}

function blobToBase64(blob: Blob): Promise<string> {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.onload = () => {
      // data:application/pdf;base64,XYZ → XYZ
      const result = reader.result as string;
      const base64 = result.split(',')[1] ?? '';
      resolve(base64);
    };
    reader.onerror = () => reject(reader.error || new Error('FileReader-Fehler'));
    reader.readAsDataURL(blob);
  });
}

/**
 * Gesamtgröße aller Anhänge berechnen (in Bytes, näherungsweise).
 * Base64 ist ~33% größer als die Original-Bytes.
 */
export function totalAttachmentBytes(attachments: EmailAttachment[]): number {
  return attachments.reduce(
    (sum, att) => sum + Math.ceil(att.content.length * 0.75),
    0,
  );
}

/**
 * Filename-Vorschlag für eine Bankkarte – mit IBAN-Suffix damit beim
 * Empfänger klar ist, welches Konto gemeint ist.
 */
export function bankCardAttachmentName(iban: string | undefined): string {
  if (!iban) return 'Bankkarte.pdf';
  const lastFour = iban.replace(/\s+/g, '').slice(-4);
  return `Bankkarte-${lastFour}.pdf`;
}

/**
 * Filename-Vorschlag für Ausweis-PDF abhängig vom Typ.
 */
export function identityDocAttachmentName(
  type: string,
  documentNumber: string | undefined,
): string {
  const base = type === 'PASSPORT'
    ? 'Reisepass'
    : type === 'DRIVERS_LICENSE'
      ? 'Fuehrerschein'
      : type === 'OTHER'
        ? 'Ausweisdokument'
        : 'Personalausweis';
  return documentNumber ? `${base}-${documentNumber}.pdf` : `${base}.pdf`;
}
