import { describe, it, expect } from 'vitest'
import { buildCycleCsv } from '../csv-builder'

interface Row {
  station: string
  cycle: number
  ct: number
  timeType: string | null
}

function row(overrides: Partial<Row> = {}): Row {
  return {
    station: 'Station A',
    cycle: 1,
    ct: 12.5,
    timeType: 'prozesszeit',
    ...overrides,
  }
}

describe('buildCycleCsv', () => {
  it('returns a header line + one data line', () => {
    const csv = buildCycleCsv([row()])
    const lines = csv.split('\n')
    expect(lines[0]).toBe('Station;Zyklus;Zeit;Zeitart')
    expect(lines[1]).toBe('Station A;1;12.5;prozesszeit')
  })

  it('handles null timeType gracefully', () => {
    const csv = buildCycleCsv([row({ timeType: null })])
    const lines = csv.split('\n')
    expect(lines[1]).toBe('Station A;1;12.5;')
  })

  it('prefixes formula-injection characters with apostrophe', () => {
    const csv = buildCycleCsv([row({ station: '=SUM(A1)' })])
    const lines = csv.split('\n')
    expect(lines[1]).toMatch(/^'=SUM\(A1\);/)
  })

  it('prefixes all four injection-lead characters: = + - @', () => {
    const injectionCases = ['=bad', '+bad', '-bad', '@bad']
    for (const station of injectionCases) {
      const csv = buildCycleCsv([row({ station })])
      const lines = csv.split('\n')
      expect(lines[1].startsWith("'")).toBe(true)
    }
  })

  it('does not prefix safe values', () => {
    const csv = buildCycleCsv([row({ station: 'Station B' })])
    const lines = csv.split('\n')
    expect(lines[1].startsWith("'")).toBe(false)
  })

  it('returns only header for empty input', () => {
    const csv = buildCycleCsv([])
    expect(csv).toBe('Station;Zyklus;Zeit;Zeitart')
  })

  it('produces multiple rows in order', () => {
    const csv = buildCycleCsv([row({ cycle: 1, ct: 10 }), row({ cycle: 2, ct: 11 })])
    const lines = csv.split('\n')
    expect(lines).toHaveLength(3)
    expect(lines[1]).toContain('1;10')
    expect(lines[2]).toContain('2;11')
  })
})
