import { execFileSync } from 'node:child_process'
import { mkdtempSync, mkdirSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { describe, expect, it } from 'vitest'

const repositoryRoot = join(process.cwd(), '..')
const validator = join(repositoryRoot, 'scripts', 'validate-ui-boundary.mjs')

function fixture(source: string) {
  const root = mkdtempSync(join(tmpdir(), 'kbx-ui-boundary-'))
  mkdirSync(join(root, 'src', 'features', 'fixture'), { recursive: true })
  writeFileSync(join(root, 'src', 'features', 'fixture', 'Example.vue'), source)
  return root
}

describe('KBX UI boundary gate', () => {
  it('passes feature code that uses KBX contracts and reports raw colors as debt warnings', () => {
    const root = fixture('<template><button class="kbx-button">저장</button></template><style>.kbx-button{color:#fff}</style>')
    const output = execFileSync(process.execPath, [validator, '--root', root], { encoding: 'utf8' })
    expect(output).toContain('failures=0')
    expect(output).toContain('raw color requires token-debt classification')
  })

  it('fails direct vendor imports and supplier CSS leakage in feature code', () => {
    const root = fixture('<script setup>import Button from "primevue/button"</script><style>:deep(.p-button){height:42px!important}</style>')
    expect(() => execFileSync(process.execPath, [validator, '--root', root], { encoding: 'utf8' })).toThrow()
  })
})
