// Upload-Accept-Liste.
//
// Historie, damit die Umkehrung nachvollziehbar bleibt: KAR-961/P4 hatte `.xls`
// bewusst abgelehnt und dafür eine präzise Fehlermeldung eingeführt
// (`isLegacyXlsFileName` + `LEGACY_XLS_UNSUPPORTED_MESSAGE_DE`), weil ExcelJS
// das Binärformat nicht öffnen kann. Seit 27.07.2026 liest der Ingest `.xls`
// über `legacy-workbook-shim.ts` — die Ablehnung ist damit gegenstandslos und
// die Accept-Liste um `.xls` erweitert.
//
// `isLegacyXlsFileName` bleibt bestehen: das Prädikat sagt weiterhin korrekt
// "das ist eine Altformat-Datei", nur die Konsequenz daraus ist nicht mehr
// "ablehnen", sondern "über den BIFF-Lesepfad einlesen". Die frühere Kopplung
// "was dieses Prädikat trifft, lehnt die Accept-Liste ab" ist deshalb bewusst
// aufgehoben und wird hier in ihr Gegenteil verkehrt festgehalten.
import { describe, it, expect } from 'vitest'
import { existsSync, readdirSync } from 'node:fs'
import path from 'node:path'
import { isAllowedQafFileName, isLegacyXlsFileName, LEGACY_XLS_UNSUPPORTED_MESSAGE_DE } from '../qaf-upload-constants'

describe('isAllowedQafFileName', () => {
  it('accepts .xlsx and .xlsm, case-insensitively', () => {
    expect(isAllowedQafFileName('offer.xlsx')).toBe(true)
    expect(isAllowedQafFileName('OFFER.XLSX')).toBe(true)
    expect(isAllowedQafFileName('template.xlsm')).toBe(true)
    expect(isAllowedQafFileName('TEMPLATE.XLSM')).toBe(true)
  })

  it('accepts .xls, seit der Ingest das Altformat liest', () => {
    expect(isAllowedQafFileName('legacy-quote.xls')).toBe(true)
    expect(isAllowedQafFileName('LEGACY-QUOTE.XLS')).toBe(true)
  })

  it('rejects every other extension', () => {
    expect(isAllowedQafFileName('notes.docx')).toBe(false)
    expect(isAllowedQafFileName('data.csv')).toBe(false)
    expect(isAllowedQafFileName('archive.zip')).toBe(false)
    expect(isAllowedQafFileName('no-extension')).toBe(false)
  })
})

describe('isLegacyXlsFileName', () => {
  it('matches .xls, case-insensitively, with surrounding whitespace trimmed', () => {
    expect(isLegacyXlsFileName('legacy-quote.xls')).toBe(true)
    expect(isLegacyXlsFileName('LEGACY-QUOTE.XLS')).toBe(true)
    expect(isLegacyXlsFileName('  spaced.xls  ')).toBe(true)
  })

  it('does NOT match .xlsx or .xlsm — the "x"/"m" suffix must not be swallowed by the .xls check', () => {
    expect(isLegacyXlsFileName('offer.xlsx')).toBe(false)
    expect(isLegacyXlsFileName('OFFER.XLSX')).toBe(false)
    expect(isLegacyXlsFileName('template.xlsm')).toBe(false)
  })

  it('does not match unrelated extensions or a bare "xls" substring mid-name', () => {
    expect(isLegacyXlsFileName('notes.docx')).toBe(false)
    expect(isLegacyXlsFileName('xls-report.pdf')).toBe(false)
    expect(isLegacyXlsFileName('no-extension')).toBe(false)
  })

  it('was es trifft, wird jetzt AKZEPTIERT statt abgelehnt (Umkehrung zu KAR-961/P4)', () => {
    const names = ['legacy-quote.xls', 'LEGACY.XLS', 'offer-old.xls']
    for (const name of names) {
      expect(isLegacyXlsFileName(name)).toBe(true)
      expect(isAllowedQafFileName(name)).toBe(true)
    }
  })
})

// Die Konstante bleibt im Repo, hat aber seit der Öffnung keinen produktiven
// Konsumenten mehr (verifiziert per repo-weitem Grep). Der Test hält nur noch
// ihren Wortlaut fest, damit eine spätere Wiederverwendung nicht unbemerkt eine
// veraltete Aussage transportiert.
describe('LEGACY_XLS_UNSUPPORTED_MESSAGE_DE (ohne Produktiv-Konsument)', () => {
  it('names the actionable fix (.xlsx re-save)', () => {
    expect(LEGACY_XLS_UNSUPPORTED_MESSAGE_DE).toContain('.xls')
    expect(LEGACY_XLS_UNSUPPORTED_MESSAGE_DE).toContain('.xlsx neu speichern')
  })
})

// Env-gated Realkorpus-Beleg. Vorher bewies er, dass jede Altdatei zuverlässig
// abgelehnt wird; jetzt beweist er das Gegenteil: dass keine davon mehr am
// Upload-Gate scheitert. Scannt rein strukturell (nur Endungen) — kein
// Dateiname wird hartkodiert oder geloggt, kein Inhalt gelesen.
const CORPUS_QAF_DIR = '/home/aria/work/qaf-corpus/incoming/QAFs'

describe.skipIf(!existsSync(CORPUS_QAF_DIR))('Altformat im Realkorpus (env-gated)', () => {
  it('jede .xls-Datei im Korpus passiert das Upload-Gate', () => {
    const xlsFiles = readdirSync(CORPUS_QAF_DIR).filter((name) => path.extname(name).toLowerCase() === '.xls')
    // Assert auf Fundzahl, damit der Test nicht still durchläuft, weil er ein
    // leeres oder falsches Verzeichnis gescannt hat.
    expect(xlsFiles.length).toBeGreaterThan(0)
    for (const name of xlsFiles) {
      expect(isLegacyXlsFileName(name)).toBe(true)
      expect(isAllowedQafFileName(name)).toBe(true)
    }
  })
})
