import { describe, expect, it } from 'vitest'
import JSZip from 'jszip'
import type { Assessment, AssessmentResponse, QuestionWithCategories } from '@/lib/assessment-types'
import { buildFabrikanalyseCopilotDocx } from '../internal/assessment-docx'

function assessment(overrides: Partial<Assessment> = {}): Assessment {
  return {
    id: 'a1',
    title: 'Werksbesuch Musterwerk',
    location: 'Halle 3',
    assessment_number: 'FA-2026-001',
    supplier_name: 'Musterzulieferer GmbH',
    conducted_at: '2026-07-01',
    project_id: 'p1',
    status: 'in_progress',
    created_by: 'u1',
    created_at: '2026-07-01T08:00:00Z',
    updated_at: '2026-07-01T08:00:00Z',
    is_demo: false,
    ...overrides,
  }
}

function questions(): QuestionWithCategories[] {
  return [
    {
      id: 'q1',
      index_number: 1,
      main_category_id: 'm1',
      sub_category_id: 's1',
      question_text: 'Is the process documented?',
      question_text_de: 'Ist der Prozess dokumentiert?',
      question_text_en: null,
      answer_text_1: 'No',
      answer_text_1_de: 'Nein',
      answer_text_1_en: null,
      answer_text_2: 'Partly',
      answer_text_2_de: 'Teilweise',
      answer_text_2_en: null,
      answer_text_3: 'Yes',
      answer_text_3_de: 'Ja',
      answer_text_3_en: null,
      answer_text_4: 'Best practice',
      answer_text_4_de: 'Best Practice',
      answer_text_4_en: null,
      is_active: true,
      sort_order: 1,
      created_at: '2026-01-01T00:00:00Z',
      updated_at: '2026-01-01T00:00:00Z',
      main_category: { id: 'm1', code: 'M1', label: 'Prozessfähigkeit', label_de: 'Prozessfähigkeit', label_en: null, sort_order: 1, is_active: true },
      sub_category: { id: 's1', main_category_id: 'm1', code: 'S1', label: 'Dokumentation', label_de: 'Dokumentation', label_en: null, sort_order: 1, is_active: true },
    },
  ]
}

function responses(): AssessmentResponse[] {
  return [
    {
      id: 'r1',
      assessment_id: 'a1',
      question_id: 'q1',
      is_relevant: true,
      is_flagged: false,
      selected_rating: 2,
      comment: 'Dokumentation ist unvollständig.',
      updated_by: 'u1',
      updated_at: '2026-07-01T09:00:00Z',
    },
  ]
}

async function documentXml(buf: Buffer): Promise<string> {
  const zip = await JSZip.loadAsync(buf)
  const entry = zip.file('word/document.xml')
  if (!entry) throw new Error('word/document.xml missing from generated DOCX')
  return entry.async('string')
}

describe('buildFabrikanalyseCopilotDocx', () => {
  it('produces a real DOCX containing the AI-instruction block, glossary, and question/rating/comment content', async () => {
    const buf = await buildFabrikanalyseCopilotDocx({
      assessment: assessment(),
      questions: questions(),
      responses: responses(),
      generatedAtLabel: '19.07.2026, 10:00',
    })
    expect(Buffer.isBuffer(buf)).toBe(true)
    expect(buf.length).toBeGreaterThan(0)

    const xml = await documentXml(buf)
    expect(xml).toContain('Fabrikanalyse-Export')
    expect(xml).toContain('Werksbesuch Musterwerk')
    expect(xml).toContain('Musterzulieferer GmbH')
    expect(xml).toContain('Ist der Prozess dokumentiert?')
    expect(xml).toContain('Dokumentation ist unvollständig.')
    expect(xml).toContain('Lean Shop-floor Cycle')
    expect(xml).not.toContain('Demo-Hinweis')
  })

  it('renders the fictional-data disclaimer only when the assessment is_demo is true', async () => {
    const withDemo = await buildFabrikanalyseCopilotDocx({
      assessment: assessment({ is_demo: true }),
      questions: questions(),
      responses: responses(),
      generatedAtLabel: 'x',
    })
    const withoutDemo = await buildFabrikanalyseCopilotDocx({
      assessment: assessment({ is_demo: false }),
      questions: questions(),
      responses: responses(),
      generatedAtLabel: 'x',
    })
    expect(await documentXml(withDemo)).toContain('Demo-Hinweis')
    expect(await documentXml(withoutDemo)).not.toContain('Demo-Hinweis')
  })
})
