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

const appShell = readFileSync(
  fileURLToPath(new URL('../src/views/AppShellRouteView.vue', import.meta.url)),
  'utf8'
)
const appShellComposable = readFileSync(
  fileURLToPath(new URL('../src/composables/useAppShell.js', import.meta.url)),
  'utf8'
)
const workbench = readFileSync(
  fileURLToPath(new URL('../src/components/business/PersonalWorkbench.vue', import.meta.url)),
  'utf8'
)
const aiMode = readFileSync(
  fileURLToPath(new URL('../src/components/business/PersonalWorkbenchAiMode.vue', import.meta.url)),
  'utf8'
)
const aiModeTemplate = readFileSync(
  fileURLToPath(new URL('../src/components/business/PersonalWorkbenchAiMode.template.html', import.meta.url)),
  'utf8'
)
const aiModeRuntimeDir = fileURLToPath(new URL('../src/composables/workbenchAiMode/', import.meta.url))
const aiModeRuntime = readdirSync(aiModeRuntimeDir)
  .filter((file) => file.endsWith('.js'))
  .sort()
  .map((file) => readFileSync(new URL(`../src/composables/workbenchAiMode/${file}`, import.meta.url), 'utf8'))
  .join('\n')
const aiModeSurface = `${aiMode}\n${aiModeTemplate}\n${aiModeRuntime}`
const aiDetailReference = readFileSync(
  fileURLToPath(new URL('../src/utils/aiDocumentDetailReference.js', import.meta.url)),
  'utf8'
)

test('workbench document detail keeps workbench as the return target', () => {
  assert.match(workbench, /source:\s*'workbench'/)
  assert.match(workbench, /returnTo:\s*'workbench'/)
  assert.match(appShell, /:back-label="detailBackLabel"/)
  assert.match(appShell, /const explicitReturnTo = resolveDocumentDetailReturnTarget\(payload\.returnTo\)/)
  assert.match(appShell, /const fallbackToWorkbench = \(/)
  assert.match(appShell, /String\(payload\.source \|\| ''\)\.trim\(\) === 'workbench'/)
  assert.match(appShell, /const returnTo = explicitReturnTo \|\| \(fallbackToWorkbench \? 'workbench' : ''\)/)
  assert.match(appShell, /const detailPayload = request \|\| \{[\s\S]*detailLookupOnly:\s*true[\s\S]*\}/)
  assert.match(appShell, /openRequestDetail\(detailPayload,\s*\{ returnTo \}\)/)
  assert.match(appShellComposable, /const detailReturnTarget = computed/)
  assert.match(appShellComposable, /if \(detailReturnTarget\.value === 'workbench'\) return '返回首页'/)
  assert.match(appShellComposable, /detailReturnTarget\.value === 'value' \? '返回经营价值' : '返回单据中心'/)
  assert.match(appShellComposable, /const returnTo = resolveDocumentDetailReturnTarget\(options\.returnTo\)/)
  assert.match(appShellComposable, /nextQuery\.returnTo = returnTo/)
  assert.match(appShellComposable, /router\.push\(\{ name: 'app-workbench' \}\)/)
  assert.match(appShellComposable, /router\.push\(\{ name: 'app-documents', query: buildDocumentReturnQuery\(\) \}\)/)
})

test('AI conversation document detail returns to the active conversation content', () => {
  assert.match(aiDetailReference, /source:\s*'ai-conversation'/)
  assert.match(aiDetailReference, /returnTo:\s*'conversation'/)
  assert.match(appShell, /@back-to-requests="handleDocumentDetailBack"/)
  assert.match(appShell, /const DOCUMENT_DETAIL_RETURN_TARGETS = new Set\(\['workbench', 'conversation', 'value'\]\)/)
  assert.match(
    appShell,
    /function handleDocumentDetailBack\(\) \{[\s\S]*detailReturnTarget\.value === 'conversation'[\s\S]*dispatchAiSidebarCommand\('open-recent', activeConversation\)/
  )
  assert.match(
    appShellComposable,
    /if \(detailReturnTarget\.value === 'conversation'\) \{[\s\S]*return '返回对话'/
  )
  assert.match(
    appShellComposable,
    /if \(detailReturnTarget\.value === 'conversation'\) \{[\s\S]*return router\.push\(\{ name: 'app-workbench' \}\)/
  )
})

test('AI detail links resolve real claim identity before opening document detail', () => {
  assert.match(aiModeSurface, /buildAiDocumentDetailRequest/)
  assert.match(aiModeSurface, /parseAiApplicationDetailHref/)
  assert.match(aiModeSurface, /parseAiDocumentDetailHref/)
  assert.match(aiDetailReference, /detailLookupOnly:\s*true/)
  assert.match(aiDetailReference, /params\.get\('claim_id'\)/)
  assert.match(aiDetailReference, /params\.get\('claim_no'\)/)
  assert.match(aiDetailReference, /isBusinessDocumentReference/)
  assert.match(aiDetailReference, /const claimId = explicitClaimId \|\| \(!referenceIsBusinessNo \? reference : ''\)/)
  assert.match(aiDetailReference, /const claimNo = explicitClaimNo \|\| \(referenceIsBusinessNo \? reference : ''\)/)
  assert.match(
    appShell,
    /v-else-if="activeView === 'documents' && detailMode && !selectedRequest"[\s\S]*正在加载完整单据详情/
  )
  assert.match(
    appShell,
    /const detailPayload = request \|\| \{[\s\S]*detailLookupOnly:\s*true[\s\S]*\}/
  )
  assert.match(appShell, /isBusinessDocumentReference/)
  assert.match(appShell, /const requestCandidates = Array\.isArray\(workbenchRequests\.value\)/)
  assert.match(appShell, /claimId:\s*fallbackClaimId/)
  assert.match(appShell, /claimNo:\s*fallbackClaimNo/)
  assert.match(
    appShellComposable,
    /const isDetailLookupOnlyRequest = isDetailLookupOnlyPayload\(request\)[\s\S]*selectedRequestSnapshot\.value = isDetailLookupOnlyRequest \? null : request \|\| null/
  )
  assert.match(appShellComposable, /const workbenchRequests = computed/)
  assert.match(appShellComposable, /workbenchRequests\.value\.find\(\(item\) => isSameRequestIdentity\(item, requestId\)\)/)
  assert.match(
    appShellComposable,
    /void refreshSelectedRequestDetail\(isDetailLookupOnlyRequest \? requestId : request\)/
  )
})
