import { defineConfig } from 'vite'
import uni from '@dcloudio/vite-plugin-uni'
import { resolve } from 'path'
import { readFileSync, writeFileSync, existsSync, unlinkSync } from 'fs'
import dotenv from 'dotenv'

// 自定义插件：替换 manifest.json 中的 appid
// 仅在通过HBuilder首次编译时执行，避免热重载时重复执行导致内存占用高
function replaceManifestAppid() {
  return {
    name: 'replace-manifest-appid',
    buildStart() {
      // 检查是否通过HBuilder编译
      // 检查是否已经执行过插件
      const manifestUpdatedFlag = resolve(__dirname, '.manifest-updated')
      const isFirstCompile = !existsSync(manifestUpdatedFlag)

      // 仅首次编译时执行
      if (!isFirstCompile) {
        console.log('跳过 manifest appid 更新（已执行过首次编译）')
        return
      }

      // 获取环境变量，明确指定路径为项目根目录
      dotenv.config({ path: resolve(__dirname, '.env') })
      const appid = process.env.VITE_APPID
      const uni_appId = process.env.VITE_UNI_APPID

      if (appid && uni_appId) {
        // 读取 manifest.json 文件
        const manifestPath = resolve(__dirname, 'manifest.json')
        let manifestContent = readFileSync(manifestPath, 'utf-8')
        // 解析 JSON
        const manifest = JSON.parse(manifestContent)
        // 替换
        manifest.appid = uni_appId

        if (manifest['mp-weixin']) {
          manifest['mp-weixin'].appid = appid
        }

        // 写回文件
        writeFileSync(manifestPath, JSON.stringify(manifest, null, 4))
        // 创建标记文件，表示已执行过插件
        writeFileSync(manifestUpdatedFlag, 'Manifest updated by HBuilder first compile')
        console.log(`Manifest appid 已更新为: ${uni_appId}`)
        console.log(`Manifest mp-weixin appid 已更新为: ${appid}`)
      } else {
        console.warn('未找到 VITE_APPID 和 VITE_UNI_APPID 环境变量，使用默认值')
      }
    },
  }
}

// 检查是否通过HBuilder编译，决定是否启用插件
const manifestUpdatedFlag = resolve(__dirname, '.manifest-updated')

if (existsSync(manifestUpdatedFlag)) {
  unlinkSync(manifestUpdatedFlag)
  console.log('已清理 manifest 更新标记文件')
}

const plugins = manifestUpdatedFlag ? [replaceManifestAppid(), uni()] : [uni()]
export default defineConfig({
  plugins,
  resolve: {
    alias: {
      '@': '/src',
    },
  },
  build: {
    minify: 'terser',
    terserOptions: {
      compress: {
        drop_console: true,
      },
    },
  },
})
