import { readdirSync, statSync, readFileSync, writeFileSync } from 'fs'
import { join, relative, sep } from 'path'

const DIST = join(import.meta.dirname, '..', 'dist')
const MANIFEST_TEMPLATE = join(import.meta.dirname, '..', 'public', 'imsmanifest.xml')
const MANIFEST_OUT = join(DIST, 'imsmanifest.xml')

/**
 * Escanea recursivamente dist/ y genera un <file href="..."/> por cada archivo,
 * usando '/' como separador (requerido por SCORM).
 */
function scanFiles(dir, basePath = '') {
  const entries = readdirSync(dir)
  const files = []

  for (const entry of entries) {
    const full = join(dir, entry)
    const relativePath = basePath ? `${basePath}/${entry}` : entry

    if (statSync(full).isDirectory()) {
      files.push(...scanFiles(full, relativePath))
    } else if (entry !== 'imsmanifest.xml') {
      // SCORM usa '/' como separador de ruta
      files.push(relativePath.split(sep).join('/'))
    }
  }

  return files
}

// Leer template del manifiesto
let manifest = readFileSync(MANIFEST_TEMPLATE, 'utf-8')

// Escanear archivos en dist/
const distFiles = scanFiles(DIST)
console.log(`📁 Archivos encontrados en dist/: ${distFiles.length}`)

// Generar los <file> elements
const fileElements = distFiles
  .map((f) => `      <file href="${f}"/>`)
  .join('\n')

// Reemplazar el bloque de resources en el manifiesto
// Busca <resource ...> y reemplaza su contenido de <file> manteniendo el resto
const resourceRegex = /(<resource\s+identifier="resource_1"[^>]*>)([\s\S]*?)(<\/resource>)/
manifest = manifest.replace(resourceRegex, (_, open, _inner, close) => {
  return `${open}\n${fileElements}\n    ${close}`
})

// Escribir manifiesto actualizado en dist/
writeFileSync(MANIFEST_OUT, manifest, 'utf-8')
console.log('✅ imsmanifest.xml generado con todos los archivos del build')
console.log(`   → ${MANIFEST_OUT}`)
