import { existsSync, readFileSync } from 'node:fs'

const requiredFiles = [
  'src/app/App.tsx',
  'src/pages/login.tsx',
  'src/pages/workspace-body.tsx',
  'src/pages/workspace-home.tsx',
  'src/pages/workspace-explore.tsx',
  'src/pages/projects/project-overview.tsx',
  'src/pages/projects/project-channel-page.tsx',
  'src/pages/projects/project-tasks.tsx',
  'src/pages/projects/project-ai.tsx',
  'src/pages/projects/project-notes.tsx',
  'src/pages/projects/project-cron.tsx',
  'src/pages/projects/project-new-channel.tsx',
  'src/pages/projects/project-rail.tsx',
  'src/pages/projects/project-sidebar.tsx',
  'src/pages/projects/project-topbar.tsx',
  'src/pages/projects/project-statusbar.tsx',
  'src/pages/projects/project-types.ts',
  'src/api/client.ts',
  'src/api/projects.ts',
  'src/api/mappers.tsx',
]

const failures = requiredFiles.filter((file) => !existsSync(file)).map((file) => `missing ${file}`)

const tokenSource = existsSync('src/styles/tokens.css') ? readFileSync('src/styles/tokens.css', 'utf8') : ''
for (const token of ['--color-primary: #165dff', '--font-sans', '--space-4: 16px']) {
  if (!tokenSource.toLowerCase().includes(token)) failures.push(`missing token ${token}`)
}
for (const forbidden of ['森林Agent', 'AI智能体', '实时接口', '进度 60%']) {
  for (const file of requiredFiles.filter((name) => name.endsWith('.tsx'))) {
    if (readFileSync(file, 'utf8').includes(forbidden)) failures.push(`${file} contains forbidden copy ${forbidden}`)
  }
}

if (existsSync('src/App.tsx')) {
  failures.push('legacy src/App.tsx should be removed after page split')
}

for (const removed of ['src/pages/projects/project-data.tsx', 'src/pages/projects/project-inspector.tsx', 'src/pages/projects/project-inbox.tsx']) {
  if (existsSync(removed)) {
    failures.push(`${removed} should be removed; frontend data must come from backend APIs`)
  }
}

if (existsSync('src/app/App.tsx')) {
  const appSource = readFileSync('src/app/App.tsx', 'utf8')
  for (const forbidden of ['function LoginPage', 'function Workbench', 'function OverviewContent']) {
    if (appSource.includes(forbidden)) {
      failures.push(`src/app/App.tsx still contains ${forbidden}`)
    }
  }
}

const html = readFileSync('index.html', 'utf8')
if (!html.includes('<html lang="zh-CN">')) failures.push('index language must be zh-CN')
if (!html.includes('<title>森林AI</title>')) failures.push('document title must be 森林AI')
if (!existsSync('public/senlinai-icon.svg')) failures.push('missing public/senlinai-icon.svg')
if (!html.includes('href="/senlinai-icon.svg"')) failures.push('index must use senlinai-icon.svg as the canonical favicon')
if (existsSync('public/favicon.svg')) failures.push('legacy public/favicon.svg must be removed; senlinai-icon.svg is the only brand asset')
if (existsSync('public/senlinai-icon.svg')) {
  const icon = readFileSync('public/senlinai-icon.svg', 'utf8')
  if (icon.includes('<text') || icon.includes('<title')) failures.push('brand SVG must not include text or title metadata')
  if (icon.includes('role=') || icon.includes('aria-labelledby=')) failures.push('brand SVG must not expose presentation ARIA')
}
const appStyles = readFileSync('src/App.css', 'utf8')
if (/\.theme-dark\s*\{[^}]*--color-primary\s*:/s.test(appStyles)) {
  failures.push('theme-dark must not override the #165DFF primary token')
}
if (!appStyles.includes('.brand-icon {')) failures.push('brand-icon must have an explicit base size')
if (!appStyles.includes('.brand-lockup.large .brand-icon')) failures.push('login brand icon must have an explicit size')
if (!appStyles.includes('.rail-brand {')) failures.push('rail brand button must have explicit layout')
if (appStyles.includes('.brand-symbol')) failures.push('legacy brand-symbol styles must be removed')
for (const file of ['src/pages/login.tsx', 'src/pages/projects/project-topbar.tsx', 'src/pages/projects/project-rail.tsx']) {
  const source = readFileSync(file, 'utf8')
  if (!source.includes('/senlinai-icon.svg')) failures.push(`${file} must use the brand icon`)
}

if (failures.length) {
  console.error(failures.join('\n'))
  process.exit(1)
}

console.log('structure ok')
