// preset/index.ts

import { fileURLToPath } from 'node:url'
import { createRequire } from 'node:module'
import type { NitroPreset } from 'nitropack'
import { join, resolve } from 'pathe'
import { globby } from 'globby'
import { readPackageJSON } from 'pkg-types'
import { writeFile } from './utils'

export default <NitroPreset>{
  extends: 'node',
  entry: fileURLToPath(new URL('./entry.ts', import.meta.url)),
  // serveStatic: true,
  hooks: {
    async compiled(nitro) {
      const _require = createRequire(import.meta.url)

      const jsons = await globby(join(nitro.options.output.serverDir, 'node_modules/**/package.json'))
      const prefixLength = `${nitro.options.output.serverDir}/node_modules/`.length
      const suffixLength = '/package.json'.length

      const dependencies = jsons.reduce((obj, packageJson) => {
        const dirname = packageJson.slice(prefixLength, -suffixLength)
        if (!dirname.includes('node_modules')) {
          obj[dirname] = _require(packageJson).version
        }
        return obj
      }, {} as Record<string, string>)

      const getPackageVersion = async (id: string) => {
        const pkg = await readPackageJSON(id, {
          url: nitro.options.nodeModulesDirs
        })
        return pkg.version
      }

      await writeFile(
        resolve(nitro.options.output.serverDir, 'package.json'),
        JSON.stringify(
          {
            name: 'nitro-output',
            version: '0.0.0',
            private: true,
            dependencies: {
              'firebase-functions-test': 'latest',
              'firebase-admin': await getPackageVersion('firebase-admin'),
              'firebase-functions': await getPackageVersion('firebase-functions'),
              ...dependencies
            }
          },
          null,
          2
        )
      )
    }
  }
}