// Einheitliches Label für Vertragsauswahl-Listen (Assign-Modals, Neue-
// Aufgabe, Neue-Support-Anfrage, Vorgänger-Vertrag, PDF-Vorlage-Test).
//
// User-Wunsch 2026-07-04: überall, wo man einen Vertrag aus einer Liste
// wählt, sollen zusätzlich zur Vertragsnummer folgende Infos sichtbar
// sein, sofern vorhanden:
//   - Kundennummer (interne CRM-Nummer des Kunden)
//   - Vertragsnummer beim Anbieter (contractNumberAtProvider)
//   - Zählernummer (Strom/Gas, aus energyDetails.meter)
//   - Mobilfunknummer (main SIM) bei Mobilfunk
//   - Erste Festnetznummer bei Internet-Verträgen
//
// Der Helper liefert entweder eine flache Textzeile
// (`formatContractLabel`) oder ein strukturiertes Objekt mit Bestandteilen
// (`buildContractLabelParts`), damit UI-Views mit mehreren Zeilen /
// Badges das gleiche Modell teilen.

import type { Contract } from '../types';

export interface ContractLabelParts {
  /** Interne Vertragsnummer (immer vorhanden). */
  contractNumber: string;
  /** Anbietername oder null, wenn keiner gesetzt ist. */
  providerName: string | null;
  /** Tarifname oder null. */
  tariffName: string | null;
  /**
   * Kurze Zusatzinfos, jede nur wenn Daten existieren – z.B.
   * `Kdnr. 12345`, `Anbieter-Vtr. VG-2026`, `Zähler 1EMH…`,
   * `Mobil +49 …`, `Festnetz +49 …`.
   */
  extras: string[];
}

/**
 * Fischt die relevanten Zusatzfelder aus dem Contract raus. Fehlende
 * Felder werden übersprungen – das Ergebnis passt sich automatisch dem
 * Vertragstyp an (Zählernummer nur bei Strom/Gas, Mobilfunknr nur bei
 * MOBILE, Festnetznr nur bei INTERNET etc.).
 */
export function buildContractLabelParts(contract: Contract): ContractLabelParts {
  const providerName =
    contract.provider?.name ??
    (contract.providerName ? contract.providerName : null);
  const tariffName =
    contract.tariff?.name ??
    (contract.tariffName ? contract.tariffName : null);

  const extras: string[] = [];

  const customerNumber = contract.customer?.customerNumber;
  if (customerNumber) {
    extras.push(`Kdnr. ${customerNumber}`);
  }

  const providerContractNumber = contract.contractNumberAtProvider;
  if (providerContractNumber) {
    extras.push(`Anbieter-Vtr. ${providerContractNumber}`);
  }

  const meterNumber = contract.energyDetails?.meter?.meterNumber;
  if (meterNumber) {
    extras.push(`Zähler ${meterNumber}`);
  }

  // Mobilfunk: Main-SIM-Nummer bevorzugt, sonst erste vorhandene.
  const simCards = contract.mobileDetails?.simCards ?? [];
  if (simCards.length > 0) {
    const mainSim = simCards.find((s) => s.isMain && s.phoneNumber) ?? simCards.find((s) => !!s.phoneNumber);
    if (mainSim?.phoneNumber) {
      extras.push(`Mobil ${mainSim.phoneNumber}`);
    } else if (contract.mobileDetails?.phoneNumber) {
      extras.push(`Mobil ${contract.mobileDetails.phoneNumber}`);
    }
  } else if (contract.mobileDetails?.phoneNumber) {
    extras.push(`Mobil ${contract.mobileDetails.phoneNumber}`);
  }

  // Festnetz: Main-Nummer bevorzugt, sonst erste vorhandene.
  const phones = contract.internetDetails?.phoneNumbers ?? [];
  if (phones.length > 0) {
    const mainPhone = phones.find((p) => p.isMain && p.phoneNumber) ?? phones.find((p) => !!p.phoneNumber);
    if (mainPhone?.phoneNumber) {
      extras.push(`Festnetz ${mainPhone.phoneNumber}`);
    }
  }

  return {
    contractNumber: contract.contractNumber,
    providerName,
    tariffName,
    extras,
  };
}

/**
 * Flach-String-Version für <Select>-Options:
 * `GAS-XYZ · Anbieter · Tarif · Kdnr. 123 · Zähler 1EMH…`
 * Trenner: ` · ` (schmale Bullets ohne Sonderzeichen im URL/DOM).
 */
export function formatContractLabel(contract: Contract): string {
  const parts = buildContractLabelParts(contract);
  const chunks: string[] = [parts.contractNumber];
  if (parts.providerName) chunks.push(parts.providerName);
  if (parts.tariffName) chunks.push(parts.tariffName);
  chunks.push(...parts.extras);
  return chunks.join(' · ');
}
