#!/usr/bin/env node

import { args, type Arg } from './utils/args'

import * as build from './commands/build'
import * as canonicalize from './commands/canonicalize'
import { help } from './commands/help'

const sharedOptions = {
  '--help': { type: 'boolean', description: 'Display usage information', alias: '-h' },
} satisfies Arg

function buildUsage(command = 'tailwindcss') {
  return `${command} [--input input.css] [--output output.css] [--watch] [options…]`
}

function rootHelp({ invalid }: { invalid?: string } = {}) {
  help({
    invalid,
    usage: [buildUsage('tailwindcss'), buildUsage('tailwindcss build'), canonicalize.usage()],
    commands: {
      build: 'Build your CSS',
      canonicalize: 'Canonicalize candidate lists',
    },
    options: { ...build.options(), ...sharedOptions },
  })
}

async function run() {
  let argv = process.argv.slice(2)
  let command = argv[0]
  let rootFlags = args({ ...build.options(), ...sharedOptions }, argv)

  if (command === 'build') {
    let flags = args({ ...build.options(), ...sharedOptions }, argv.slice(1))

    if ((process.stdout.isTTY && argv.length === 1) || flags['--help']) {
      help({
        usage: [buildUsage('tailwindcss build')],
        options: { ...build.options(), ...sharedOptions },
      })
      process.exit(0)
    }

    await build.handle(flags)
    return
  }

  if (command === 'canonicalize') {
    let result = await canonicalize.runCommandLine({ argv: argv.slice(1) })

    if (result.stdout.length > 0) {
      process.stdout.write(`${result.stdout}\n`)
    }

    if (result.stderr.length > 0) {
      process.stderr.write(`${result.stderr}\n`)
    }

    process.exitCode = result.exitCode
    return
  }

  if ((process.stdout.isTTY && command === undefined) || rootFlags['--help']) {
    rootHelp()
    process.exit(0)
  }

  if (command && !command.startsWith('-')) {
    rootHelp({ invalid: command })
    process.exit(1)
  }

  let flags = args({
    ...build.options(),
    ...sharedOptions,
  })

  await build.handle(flags)
}

await run()