// @vitest-environment node
/**
 * Der Lader der Datenschutzerklärung.
 *
 * Gleiche Bauform wie `lizenzen.test.ts`: `datenschutzBilden` ist absichtlich
 * von `datenschutzLesen` getrennt, damit die Formprüfung ohne Electron und
 * ohne Dateisystem läuft. Geprüft wird vor allem der Fall, in dem etwas
 * fehlt — denn dort entscheidet sich, ob der Nutzende eine Begründung
 * bekommt oder einen leeren Bereich.
 */

import { describe, expect, it, vi } from 'vitest';

vi.mock('electron', () => ({
  app: {
    isPackaged: false,
    getAppPath: (): string => process.cwd(),
  },
}));

const { datenschutzBilden, datenschutzLesen, datenschutzZuruecksetzen } =
  await import('../src/main/datenschutz');

const GUELTIG = JSON.stringify({
  quellpruefsumme: 'a'.repeat(64),
  fassung: '1.5',
  stand: '30.08.2026',
  bloecke: [
    { art: 'ueberschrift', ebene: 2, text: '1. Wer verantwortlich ist', kennung: 'wer' },
    { art: 'absatz', teile: [{ art: 'text', text: 'Ein Satz.' }] },
  ],
});

describe('datenschutzBilden', () => {
  it('nimmt eine vollständige Datei an', () => {
    const angaben = datenschutzBilden(GUELTIG, null);

    expect(angaben.warnung).toBeNull();
    expect(angaben.erklaerung?.fassung).toBe('1.5');
    expect(angaben.erklaerung?.bloecke).toHaveLength(2);
  });

  it('reicht die Warnung durch, wenn gar nichts gelesen werden konnte', () => {
    const angaben = datenschutzBilden(null, 'Datei nicht gefunden.');

    expect(angaben.erklaerung).toBeNull();
    expect(angaben.warnung).toBe('Datei nicht gefunden.');
  });

  it('nennt einen Grund, wenn die Datei kein gültiges JSON ist', () => {
    const angaben = datenschutzBilden('{kaputt', null);

    expect(angaben.erklaerung).toBeNull();
    /* Ein leerer Bereich ohne Begründung wäre die schlechteste Auskunft:
       Der Nutzende hielte die Erklärung für nicht vorhanden statt für nicht
       ladbar – beim Datenschutz der falscheste aller Eindrücke. */
    expect(angaben.warnung ?? '').toContain('nicht lesbar');
  });

  it('lehnt eine Datei ohne Blöcke ab, statt einen leeren Text zu zeigen', () => {
    const leer = JSON.stringify({
      quellpruefsumme: 'a'.repeat(64),
      fassung: '1.5',
      stand: '30.08.2026',
      bloecke: [],
    });

    const angaben = datenschutzBilden(leer, null);

    expect(angaben.erklaerung).toBeNull();
    expect(angaben.warnung ?? '').toContain('unvollständig');
  });

  it('lehnt eine Datei ohne Fassungsangabe ab', () => {
    const ohneFassung = JSON.stringify({
      quellpruefsumme: 'a'.repeat(64),
      stand: '30.08.2026',
      bloecke: [{ art: 'absatz', teile: [] }],
    });

    expect(datenschutzBilden(ohneFassung, null).erklaerung).toBeNull();
  });

  it('wirft fremde Blockarten heraus, statt sie durchzureichen', () => {
    /* Die Oberfläche kennt vier Arten. Eine fünfte käme aus einer neueren
       Datei in einer älteren Anwendung – sie würde still nichts anzeigen.
       Herausgefiltert fällt sie wenigstens in der Blockzahl auf. */
    const gemischt = JSON.stringify({
      quellpruefsumme: 'a'.repeat(64),
      fassung: '1.5',
      stand: '30.08.2026',
      bloecke: [
        { art: 'absatz', teile: [{ art: 'text', text: 'Bleibt.' }] },
        { art: 'tabelle', kopf: [], zeilen: [] },
      ],
    });

    expect(datenschutzBilden(gemischt, null).erklaerung?.bloecke).toHaveLength(1);
  });
});

describe('datenschutzLesen', () => {
  it('findet die echte Datei im Quellbaum', () => {
    datenschutzZuruecksetzen();
    const angaben = datenschutzLesen();

    expect(angaben.warnung, angaben.warnung ?? '').toBeNull();
    expect(angaben.erklaerung?.bloecke.length ?? 0).toBeGreaterThan(100);
    expect(angaben.erklaerung?.fassung).toMatch(/^\d+\.\d+$/u);
  });

  it('liest nur einmal', () => {
    datenschutzZuruecksetzen();
    const erste = datenschutzLesen();
    const zweite = datenschutzLesen();

    expect(zweite).toBe(erste);
  });
});
