import fs from 'fs-extra'
import { createResolver, defineNuxtModule } from '@nuxt/kit'
import { i18n } from '../config/i18n'
import type { LocaleObject } from '#i18n'

const virtual = 'virtual:emoji-mart-lang-importer'
const resolvedVirtual = `\0${virtual}.mjs`

export default defineNuxtModule({
  meta: {
    name: 'emoji-mark-translation',
  },
  setup(_, nuxt) {
    const resolver = createResolver(import.meta.url)
    nuxt.hook('vite:extendConfig', async (viteInlineConfig) => {
      viteInlineConfig.plugins = viteInlineConfig.plugins || []
      viteInlineConfig.plugins.push({
        name: 'vite-emoji-mart-translation',
        enforce: 'pre',
        resolveId(id) {
          if (id === virtual)
            return resolvedVirtual
        },
        async load(id) {
          if (id === resolvedVirtual) {
            const locales = await Promise.all(
              Array
                .from(new Set((i18n.locales as LocaleObject[]).map(l => l.code.split('-')[0])))
                .map(async (l) => {
                  const exists = await isFile(resolver.resolve(`../node_modules/@emoji-mart/data/i18n/${l}.json`))
                  return [l, exists] as [code: string, exists: boolean]
                }))
              .then(l => l.filter(l => l[1]).map(l => l[0]))
            const switchStmt = locales.filter(l => l[1]).map((l) => {
              return `
    case "${l}":
      return import("@emoji-mart/data/i18n/${l}.json").catch(() => {});`
            })
            return `export default function(lang) {
  switch(lang) {
    ${switchStmt.join('')}
    default:
      return import("@emoji-mart/data/i18n/en.json").catch(() => {});
  }
}  
`
          }
        },
      })
    })
  },
})

async function isFile(path: string) {
  return new Promise<boolean>((resolve) => {
    fs.lstat(path, (err, stats) => {
      if (err)
        resolve(false)
      else
        resolve(stats.isFile())
    })
  })
}
