import assert from 'node:assert/strict'
import { readFileSync } from 'node:fs'
import test from 'node:test'
import { fileURLToPath } from 'node:url'

import {
  buildStructuredComposerSubmitText
} from '../src/views/scripts/useTravelReimbursementComposerTools.js'

const submitComposerScript = readFileSync(
  fileURLToPath(new URL('../src/views/scripts/useTravelReimbursementSubmitComposer.js', import.meta.url)),
  'utf8'
)
const createViewTemplate = readFileSync(
  fileURLToPath(new URL('../src/views/TravelReimbursementCreateView.vue', import.meta.url)),
  'utf8'
)
const composerToolsScript = readFileSync(
  fileURLToPath(new URL('../src/views/scripts/useTravelReimbursementComposerTools.js', import.meta.url)),
  'utf8'
)

test('composer formats date-picker expense text into readable structured fields', () => {
  const formatted = buildStructuredComposerSubmitText(
    '发生时间：2026-05-20 至 2026-05-23，去上海支撑上海国电的服务器部署，出差3天',
    {
      mode: 'range',
      start_date: '2026-05-20',
      end_date: '2026-05-23',
      business_time: '2026-05-20 至 2026-05-23'
    }
  )

  assert.equal(
    formatted,
    [
      '发生时间：2026-05-20 至 2026-05-23',
      '地点：上海',
      '事由：支撑上海国电的服务器部署',
      '天数：3天'
    ].join('\n')
  )
})

test('composer extracts destination and reason from compact travel text', () => {
  const formatted = buildStructuredComposerSubmitText(
    '出差上海，支撑国网服务器上线部署',
    {
      mode: 'single',
      start_date: '2026-05-25',
      end_date: '2026-05-25',
      business_time: '2026-05-25'
    }
  )

  assert.equal(
    formatted,
    [
      '发生时间：2026-05-25',
      '地点：上海',
      '事由：支撑国网服务器上线部署',
      '天数：1天'
    ].join('\n')
  )
})

test('composer strips raw date picker prefix before building structured display', () => {
  const formatted = buildStructuredComposerSubmitText(
    '2026-05-20 至 2026-05-23，去上海支撑上海国电的服务器部署，出差3天',
    {
      mode: 'range',
      start_date: '2026-05-20',
      end_date: '2026-05-23',
      business_time: '2026-05-20 至 2026-05-23'
    }
  )

  assert.equal(
    formatted,
    [
      '发生时间：2026-05-20 至 2026-05-23',
      '地点：上海',
      '事由：支撑上海国电的服务器部署',
      '天数：3天'
    ].join('\n')
  )
})

test('composer date selection shows raw date capsule labels', () => {
  assert.match(createViewTemplate, /aria-label="选择日期"/)
  assert.match(createViewTemplate, /aria-label="日期选择"/)
  assert.match(createViewTemplate, /aria-label="移除日期"/)
  assert.match(createViewTemplate, /handleComposerDateInputChange\('single'\)/)
  assert.match(createViewTemplate, /handleComposerDateInputChange\('range-start'\)/)
  assert.match(createViewTemplate, /handleComposerDateInputChange\('range-end'\)/)
  assert.doesNotMatch(createViewTemplate, /@click="applyComposerDateSelection"/)
  assert.doesNotMatch(createViewTemplate, /aria-label="选择业务发生时间"/)
  assert.doesNotMatch(createViewTemplate, /aria-label="移除业务发生时间"/)
  assert.doesNotMatch(composerToolsScript, /return `发生时间：\$\{composerSingleDate\.value\}`/)
  assert.match(composerToolsScript, /return composerSingleDate\.value/)
  assert.match(composerToolsScript, /return `\$\{composerRangeStartDate\.value\} 至 \$\{composerRangeEndDate\.value\}`/)
  assert.match(composerToolsScript, /function commitComposerDateSelection/)
  assert.match(composerToolsScript, /onComposerDateSelection\?\.\(selection\)/)
})

test('composer keeps backend raw text but displays structured user message', () => {
  assert.match(submitComposerScript, /const rawText = resolveComposerSubmitText\(options\.rawText\)\.trim\(\)/)
  assert.match(submitComposerScript, /resolveComposerDisplaySubmitText\(rawText\)/)
})

test('knowledge questions keep enough request time for LightRAG retrieval', () => {
  assert.match(submitComposerScript, /timeoutMs:\s*75000/)
  assert.match(submitComposerScript, /知识问答仍在检索整理/)
})
