import { readFile, writeFile } from 'node:fs/promises'
import { join } from 'node:path'
import { fileURLToPath } from 'node:url'
import { XMLParser, XMLBuilder } from 'fast-xml-parser'
import consola from 'consola'

// 获取当前文件的目录路径
const __dirname = fileURLToPath(new URL('.', import.meta.url))
// 获取项目根目录路径
const root = join(__dirname, '..')

// 定义配置文件的类型接口
interface AppConfig {
  name: string            // 应用名称
  version: string         // 应用版本号
  description: string     // 应用描述
  author: {              // 作者信息
    name: string         // 作者名称
    email: string        // 作者邮箱
  }
  homeUrl: string         // 应用主页 URL
  appId: string          // 应用 ID
  packType: 'debug' | 'release' // 打包类型
}

/**
 * 更新 config.xml 文件的配置
 * @param config 应用配置对象
 */
async function updateConfigXml(config: AppConfig) {
  // 构建 config.xml 的完整路径
  const xmlPath = join(root, 'config.xml')
  
  try {
    // 读取现有的 config.xml 文件内容
    const xmlContent = await readFile(xmlPath, 'utf-8')
    
    // 创建 XML 解析器实例，配置属性处理选项
    const parser = new XMLParser({
      ignoreAttributes: false,         // 不忽略 XML 属性
      attributeNamePrefix: '@_'        // 属性名称前缀
    })
    // 解析 XML 内容为 JavaScript 对象
    const xmlObj = parser.parse(xmlContent)

    // 更新配置信息
    xmlObj.widget['@_version'] = config.version    // 更新版本号
    xmlObj.widget['@_id'] = config.appId          // 更新应用 ID
    xmlObj.widget.name = config.name              // 更新应用名称
    xmlObj.widget.description = config.description  // 更新应用描述
    xmlObj.widget.author = {
      '#text': config.author.name,    // 作者名称作为节点文本
      '@_email': config.author.email  // 邮箱作为属性
    }

    // 更新或添加 content 标签的 src 属性
    if (!xmlObj.widget.content) {
      xmlObj.widget.content = { '@_src': config.homeUrl }
    } else {
      xmlObj.widget.content['@_src'] = config.homeUrl
    }


    // 创建 XML 构建器实例
    const builder = new XMLBuilder({
      ignoreAttributes: false,
      attributeNamePrefix: '@_',
      format: true                      // 启用格式化输出
    })
    // 将对象转换回 XML 字符串
    const newXmlContent = builder.build(xmlObj)

    // 将更新后的内容写回文件
    await writeFile(xmlPath, newXmlContent, 'utf-8')
    consola.success('config.xml has been updated')
  } catch (err) {
    consola.error('Failed to update config.xml:', err)
    process.exit(1)
  }
}

/**
 * 主函数：读取配置并执行更新
 */
async function main() {
  try {
    // 读取 config.json 配置文件
    const configPath = join(root, 'config.json')
    const configContent = await readFile(configPath, 'utf-8')
    const config: AppConfig = JSON.parse(configContent)

    // 使用配置更新 config.xml
    await updateConfigXml(config)

    // TODO: 这里可以添加其他构建步骤
    consola.success('Build completed successfully')
  } catch (err) {
    consola.error('Build failed:', err)
    process.exit(1)
  }
}

// 执行主函数
main()
