import { candidate, css, fetchStyles, html, js, retryAssertion, test, ts, txt } from '../utils'

const WORKSPACE = {
  fs: {
    'package.json': txt`
    {
      "type": "module",
      "dependencies": {
        "tailwind-merge": "^2",
        "@tailwindcss/vite": "workspace:^",
        "tailwindcss": "workspace:^"
      },
      "devDependencies": {
        "vite": "^6"
      }
    }
  `,
    'vite.config.ts': ts`
      import tailwindcss from '@tailwindcss/vite'
      import { defineConfig } from 'vite'

      export default defineConfig({
        build: { cssMinify: false },
        plugins: [tailwindcss()],
      })
    `,
    'index.html': html`
      <head>
        <link rel="stylesheet" href="./src/index.css" />
        <script type="module" src="./src/index.js"></script>
      </head>
    `,
    'src/index.js': js`
      import { twMerge } from 'tailwind-merge'

      twMerge('underline')

      console.log('underline')
    `,
    'src/index.css': css`@import 'tailwindcss/utilities' layer(utilities);`,
  },
}

test(
  'does not scan tailwind-merge in production builds',
  WORKSPACE,
  async ({ fs, exec, expect }) => {
    await exec('pnpm vite build')

    let files = await fs.glob('dist/**/*.css')
    expect(files).toHaveLength(1)
    let [, content] = files[0]

    expect(content).toMatchInlineSnapshot(`
      "@layer utilities {
        .underline {
          text-decoration-line: underline;
        }
      }
      "
    `)
  },
)

test('does not scan tailwind-merge in dev builds', WORKSPACE, async ({ spawn, expect }) => {
  let process = await spawn('pnpm vite dev')
  await process.onStdout((m) => m.includes('ready in'))

  let url = ''
  await process.onStdout((m) => {
    let match = /Local:\s*(http.*)\//.exec(m)
    if (match) url = match[1]
    return Boolean(url)
  })

  await retryAssertion(async () => {
    let styles = await fetchStyles(url, '/index.html')

    expect(styles).not.toContain(candidate`flex`)
  })
})