import * as fs from 'node:fs'
import * as path from 'node:path'

const SRC_DIR = path.resolve(__dirname, '..', 'src')

interface ExportMap {
  [key: string]: {
    import: string
    types: string
  }
}

function getAllSourceFiles(dir: string): ExportMap {
  const entries = fs.readdirSync(dir, { withFileTypes: true })
  const exportsMap: ExportMap = {}

  for (const entry of entries) {
    const fullPath = path.join(dir, entry.name)

    if (entry.isDirectory()) {
      Object.assign(exportsMap, getAllSourceFiles(fullPath))
    } else if (entry.isFile() && /\.(ts|tsx|css)$/.test(entry.name)) {
      const relativePath = path.relative(SRC_DIR, fullPath)
      const noExtension = relativePath.replace(/\.(ts|tsx)$/, '')
      const segments = noExtension.split(path.sep)

      // If filename is "index", remove it from the export path
      const isIndex = segments[segments.length - 1] === 'index'
      const exportSegments = isIndex ? segments.slice(0, -1) : segments

      const subpath = `./${exportSegments.join('/')}` // clean export
      const filePath = `./src/${relativePath.replace(/\\/g, '/')}`

      exportsMap[subpath] = {
        import: filePath,
        types: filePath,
      }
    }
  }

  return exportsMap
}

function updatePackageJson(exportsMap: ExportMap): void {
  const packageJsonPath = path.resolve(__dirname, '..', 'package.json')
  const packageJsonRaw = fs.readFileSync(packageJsonPath, 'utf8')
  const packageJson = JSON.parse(packageJsonRaw)

  packageJson.exports = {
    './package.json': './package.json',
    '.': {
      import: './index.tsx',
      types: './index.tsx',
    },
    ...exportsMap,
  }

  fs.writeFileSync(packageJsonPath, JSON.stringify(packageJson, null, 2))
  console.log('✅ package.json exports updated (with clean index paths).')
}

// Run the export generation
const exportsMap = getAllSourceFiles(SRC_DIR)
updatePackageJson(exportsMap)
