const fs = require('fs')
const readline = require('node:readline')

const componentsDirectory = `${__dirname}/../src/components`

const rl = readline.createInterface({
  input: process.stdin,
  output: process.stdout,
})

rl.question(
  `What do you want to name your new component? `,
  (newComponentName) => {
    newComponentName = newComponentName || 'NewComponent'

    rl.question(
      `What tag name do you want to use for your new component? (default: div) `,
      (tagName) => {
        tagName = tagName || 'div'

        rl.question(
          `Is this a complex component? (Y/N, default: N)`,
          (isComplex) => {
            isComplex = isComplex === 'Y' ? true : false

            const replacementsMap = {
              'NewComponent': newComponentName,
              'div': tagName,
              '//[^\n]+': '',
            }

            if (isComplex) {
              const componentDirectory = `${componentsDirectory}/${newComponentName}`

              // Make sure components directory exists
              fs.mkdirSync(componentsDirectory, { recursive: true })

              // Create the new component directory and copy the template files
              fs.cpSync(
                `${__dirname}/templates/NewComponent`,
                componentDirectory,
                {
                  recursive: true,
                },
              )

              const template = fs.readFileSync(
                `${__dirname}/templates/NewComponent/NewComponent.tsx`,
                'utf8',
              )

              const mergedTemplate = Object.entries(replacementsMap).reduce(
                (acc, [key, value]) => {
                  return acc.replace(new RegExp(`${key}`, 'isg'), value)
                },
                template,
              )

              const newComponentFile = `${componentDirectory}/NewComponent.tsx`

              fs.writeFileSync(newComponentFile, mergedTemplate)

              fs.writeFileSync(
                `${componentDirectory}/index.ts`,
                `export { ${newComponentName} } from './${newComponentName}'\n`,
              )

              fs.renameSync(
                newComponentFile,
                `${componentDirectory}/${newComponentName}.tsx`,
              )
            } else {
              const newComponentFile = `${componentsDirectory}/${newComponentName}.tsx`

              fs.cpSync(
                `${__dirname}/templates/NewComponent.tsx`,
                newComponentFile,
              )

              const template = fs.readFileSync(
                `${__dirname}/templates/NewComponent.tsx`,
                'utf8',
              )

              const mergedTemplate = Object.entries(replacementsMap).reduce(
                (acc, [key, value]) => {
                  return acc.replace(new RegExp(`${key}`, 'isg'), value)
                },
                template,
              )

              fs.writeFileSync(newComponentFile, mergedTemplate)
            }

            console.log(
              `Component ${newComponentName} created at ${componentsDirectory}`,
            )

            rl.close()
          },
        )
      },
    )
  },
)