import { describe, it, expect } from 'vitest'
import ExcelJS from 'exceljs'
import { g60WorkbookFromBuffer } from '../bridge'
import { detectG60, inputRates, parseG60Workbook } from '../parser'

async function g60Buffer(): Promise<ArrayBuffer> {
  const wb = new ExcelJS.Workbook()
  const input = wb.addWorksheet('INPUT')
  input.getCell('B22').value = 'Gemeinkosten FK direktvergeben'
  input.getCell('C22').value = 0.1
  input.getCell('B42').value = 'Lohnsatz DE'
  input.getCell('C42').value = 38.5
  const st = wb.addWorksheet('Stückzahlen')
  st.getCell('C4').value = 2026
  st.getCell('C5').value = 10000
  const tab = wb.addWorksheet('2_2')
  tab.getCell('C15').value = 'P-A'
  tab.getCell('DJ41').value = { formula: '1+19', result: 20 } as ExcelJS.CellValue
  tab.getCell('W41').value = 4
  tab.getCell('Y41').value = 0.5
  return wb.xlsx.writeBuffer()
}

describe('g60WorkbookFromBuffer', () => {
  it('bridges an ExcelJS workbook to the pure G60Workbook interface', async () => {
    const g60wb = await g60WorkbookFromBuffer(await g60Buffer())
    expect(detectG60(g60wb)).toBe(true)
    expect(inputRates(g60wb).ovFK_d).toBeCloseTo(0.1)
  })

  it('resolves formula cells to their cached result (row-41 metrics)', async () => {
    const g60wb = await g60WorkbookFromBuffer(await g60Buffer())
    const parsed = parseG60Workbook(g60wb)
    expect(parsed.tabs['2_2'].Sales).toBe(20)
    expect(parsed.tabs['2_2'].Material).toBeCloseTo(4.5)
    expect(parsed.card.C42).toEqual({ label: 'Lohnsatz DE', value: 38.5 })
  })

  it('detects non-G60 workbooks as false', async () => {
    const wb = new ExcelJS.Workbook()
    wb.addWorksheet('Zusammenfassung')
    const g60wb = await g60WorkbookFromBuffer(await wb.xlsx.writeBuffer())
    expect(detectG60(g60wb)).toBe(false)
  })
})
