// cellToString — Wertkoerzierung des Summary-Parsers.
//
// Anlass für diese Datei: ein ungültiges Date riss den kompletten Summary-Parse
// ab (RangeError: Invalid time value). Aufgefallen über die env-gated
// Korpus-Tests, nachdem 2475 neue Realdateien dazukamen — der Fehler steckte
// vorher schon im Code, es hatte ihn nur nie eine Datei getroffen.
import { describe, expect, it } from 'vitest'

import { cellToString } from '../summary-parser'

describe('cellToString', () => {
  it('gibt null für leere Werte', () => {
    expect(cellToString(null)).toBeNull()
    expect(cellToString(undefined)).toBeNull()
    expect(cellToString('')).toBeNull()
    expect(cellToString('   ')).toBeNull()
  })

  it('formatiert ein gültiges Datum als ISO-String', () => {
    expect(cellToString(new Date(Date.UTC(2026, 6, 27)))).toBe('2026-07-27T00:00:00.000Z')
  })

  it('gibt für ein UNGÜLTIGES Datum null statt zu werfen', () => {
    // Der eigentliche Regressionsfall: `new Date(NaN)` ist instanceof Date,
    // aber toISOString() wirft darauf. Ungeprüft nimmt das den ganzen Parse mit,
    // statt nur dieses eine Feld leer zu lassen.
    expect(() => cellToString(new Date(NaN))).not.toThrow()
    expect(cellToString(new Date(NaN))).toBeNull()
    expect(cellToString(new Date('kein datum'))).toBeNull()
  })

  it('löst Formel- und Text-Objekte auf', () => {
    expect(cellToString({ result: 42 })).toBe('42')
    expect(cellToString({ text: 'Wert' })).toBe('Wert')
    expect(cellToString({ richText: [{ text: 'A' }, { text: 'B' }] })).toBe('AB')
  })

  it('reicht ein ungültiges Datum auch verschachtelt nicht als Absturz durch', () => {
    // Formelzellen liefern ihren Wert unter `result` — ein kaputtes Datum kann
    // also auch eine Ebene tiefer stecken.
    expect(() => cellToString({ result: new Date(NaN) })).not.toThrow()
    expect(cellToString({ result: new Date(NaN) })).toBeNull()
  })

  it('trimmt einfache Werte', () => {
    expect(cellToString('  Text  ')).toBe('Text')
    expect(cellToString(0)).toBe('0')
    expect(cellToString(false)).toBe('false')
  })
})
