import { Buffer } from 'node:buffer'
import flatten from 'flat'
import { createResolver } from '@nuxt/kit'
import fs from 'fs-extra'
import { currentLocales } from '../config/i18n'

const resolver = createResolver(import.meta.url)

const sourceLanguageLocale = currentLocales.find(l => l.code === 'en-US')!

function merge(src: Record<string, any>, dst: Record<string, any>) {
  for (const key in src) {
    if (typeof src[key] === 'object') {
      if (!dst[key])
        dst[key] = {}

      merge(src[key], dst[key])
    }
    else {
      dst[key] = src[key]
    }
  }
}

const sourceFiles = sourceLanguageLocale.files ? sourceLanguageLocale.files : [sourceLanguageLocale.file!]
const sourceTranslations: Record<string, string> = {}

for (const file of sourceFiles) {
  const data = JSON.parse(Buffer.from(
    await fs.readFile(resolver.resolve(`../locales/${file as string}`), 'utf-8'),
  ).toString()) as Record<string, unknown>

  merge(flatten(data), sourceTranslations)
}

async function removeOutdatedTranslations() {
  for (const locale of currentLocales.filter(l => l.code !== 'en-US')) {
    const files = locale.files ? locale.files as string[] : [locale.file as string]

    for (const file of files) {
      const path = resolver.resolve(`../locales/${file}`)

      const data = JSON.parse(Buffer.from(
        await fs.readFile(path, 'utf-8'),
      ).toString())

      const targetTranslations: Record<string, string> = flatten(data)

      for (const key in targetTranslations) {
        if (!sourceTranslations[key])
          delete targetTranslations[key]
      }

      const unflattened = flatten.unflatten(targetTranslations)

      await fs.writeFile(
        path,
        `${JSON.stringify(unflattened, null, 2)}\n`,
        { encoding: 'utf-8' },
      )
    }
  }
}

removeOutdatedTranslations()