import { fileURLToPath, URL } from 'node:url'
import type { ConfigEnv, UserConfigExport } from 'vite'
import { defineConfig, loadEnv } from 'vite'
import { wrapperEnv, formatDate } from './build/utils'
import { createViteProxy } from './build/vite/proxy'
import { createVitePlugins } from './build/vite/plugins'
import { cerateViteBuild } from './build/vite/build'
import pkg from './package.json'

const { name, version } = pkg
const __APP_INFO__ = {
    pkg: { name, version },
    lastBuildTime: formatDate(new Date(), 'YYYY-MM-DD HH:mm:ss'),
};
const BANNER = `
/*!
* ${name}
* Version: ${version}
* ReleaseTime: ${formatDate(new Date(), 'YYYY-MM-DD HH:mm')}
* Copyright ${formatDate(new Date(), 'YYYY')}
*/
`

// https://vitejs.dev/config/
export default ({ command, mode }: ConfigEnv): UserConfigExport => {
  const IS_BUILD = command === 'build'
  const ENV = Object.assign(loadEnv(mode, process.cwd()))
  const viteEnv = wrapperEnv(ENV)
  const { VITE_PORT, VITE_PROXY, VITE_APP_URL } = viteEnv
  const BUILD_CONFIG = cerateViteBuild(viteEnv, BANNER)

  return defineConfig({
    plugins: createVitePlugins(viteEnv, IS_BUILD),
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
        '#': fileURLToPath(new URL('./src/types', import.meta.url))
      }
    },
    css: {},
    server: {
      host: true,
      open: `${VITE_APP_URL}`,
      port: VITE_PORT,
      proxy: createViteProxy(VITE_PROXY)
    },
    build: {
      ...BUILD_CONFIG,
      minify: 'terser'
    },
    define: {
      __APP_INFO__: JSON.stringify(__APP_INFO__),
    },
  })
}
