import type { TrainingRecord } from '../engine/quiz';
import type { AISystem, CompanyProfile } from '../engine/types';

const STORAGE_KEY = 'ai-act-kompass/systems/v1';
const PROFILE_KEY = 'ai-act-kompass/profile/v1';
const TRAINING_KEY = 'ai-act-kompass/training/v1';

/** Lädt das Schulungsregister aus dem lokalen Speicher (fail-safe). */
export function loadTraining(): readonly TrainingRecord[] {
  try {
    const raw = localStorage.getItem(TRAINING_KEY);
    if (!raw) return [];
    const parsed: unknown = JSON.parse(raw);
    return Array.isArray(parsed) ? (parsed as TrainingRecord[]) : [];
  } catch {
    return [];
  }
}

/** Persistiert das Schulungsregister im lokalen Speicher. */
export function saveTraining(records: readonly TrainingRecord[]): void {
  localStorage.setItem(TRAINING_KEY, JSON.stringify(records));
}

/** Format der Export-/Import-Datei. */
export interface ExportFile {
  readonly app: 'ai-act-kompass';
  readonly schemaVersion: 1 | 2;
  readonly exportedAt: string;
  readonly systems: readonly AISystem[];
  /** Ab schemaVersion 2 enthalten. */
  readonly profile?: CompanyProfile;
}

/** Ergebnis eines Imports (Profil optional, ältere Backups haben keins). */
export interface ImportResult {
  readonly systems: readonly AISystem[];
  readonly profile: CompanyProfile | null;
}

/** Leeres Firmenprofil (Default). */
export function emptyProfile(): CompanyProfile {
  return {
    name: '',
    street: '',
    zipCity: '',
    contactPerson: '',
    email: '',
    phone: '',
    website: '',
    logoDataUrl: '',
    countries: [],
  };
}

/**
 * Lädt alle registrierten KI-Systeme aus dem lokalen Speicher.
 * Bei defekten Daten wird eine leere Liste zurückgegeben (fail-safe).
 */
export function loadSystems(): readonly AISystem[] {
  try {
    const raw = localStorage.getItem(STORAGE_KEY);
    if (!raw) return [];
    const parsed: unknown = JSON.parse(raw);
    return Array.isArray(parsed) ? (parsed as AISystem[]) : [];
  } catch {
    return [];
  }
}

/**
 * Persistiert die Systemliste im lokalen Speicher des Browsers.
 * Es verlassen keine Daten das Gerät.
 */
export function saveSystems(systems: readonly AISystem[]): void {
  localStorage.setItem(STORAGE_KEY, JSON.stringify(systems));
}

/** Lädt das Firmenprofil aus dem lokalen Speicher (fail-safe). */
export function loadProfile(): CompanyProfile {
  try {
    const raw = localStorage.getItem(PROFILE_KEY);
    if (!raw) return emptyProfile();
    const parsed: unknown = JSON.parse(raw);
    return typeof parsed === 'object' && parsed !== null
      ? { ...emptyProfile(), ...(parsed as Partial<CompanyProfile>) }
      : emptyProfile();
  } catch {
    return emptyProfile();
  }
}

/** Persistiert das Firmenprofil im lokalen Speicher des Browsers. */
export function saveProfile(profile: CompanyProfile): void {
  localStorage.setItem(PROFILE_KEY, JSON.stringify(profile));
}

/**
 * Serialisiert alle Daten als Export-Datei (JSON) für Backup/Umzug.
 *
 * @param systems - Zu exportierende Systeme
 * @param profile - Firmenprofil
 * @param exportedAt - Zeitstempel im ISO-Format
 */
export function exportData(
  systems: readonly AISystem[],
  profile: CompanyProfile,
  exportedAt: string,
): string {
  const file: ExportFile = {
    app: 'ai-act-kompass',
    schemaVersion: 2,
    exportedAt,
    systems,
    profile,
  };
  return JSON.stringify(file, null, 2);
}

/**
 * Liest eine Export-Datei ein und validiert das Grundformat.
 * Versteht schemaVersion 1 (ohne Profil) und 2 (mit Profil).
 *
 * @param json - Inhalt der Export-Datei
 * @returns Systeme und ggf. Firmenprofil aus der Datei
 * @throws Error bei unbekanntem oder defektem Format
 */
export function importData(json: string): ImportResult {
  const parsed: unknown = JSON.parse(json);
  if (
    typeof parsed !== 'object' ||
    parsed === null ||
    (parsed as ExportFile).app !== 'ai-act-kompass' ||
    !Array.isArray((parsed as ExportFile).systems)
  ) {
    throw new Error('Unbekanntes Dateiformat — keine gültige AI-Act-Kompass-Exportdatei.');
  }
  const file = parsed as ExportFile;
  return {
    systems: file.systems,
    profile: file.profile ? { ...emptyProfile(), ...file.profile } : null,
  };
}

/** Löscht alle lokal gespeicherten Daten unwiderruflich. */
export function clearAll(): void {
  localStorage.removeItem(STORAGE_KEY);
  localStorage.removeItem(PROFILE_KEY);
  localStorage.removeItem(TRAINING_KEY);
}
