import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue2'
import { VitePWA } from 'vite-plugin-pwa'
import Components from 'unplugin-vue-components/vite'
import { VuetifyResolver } from 'unplugin-vue-components/resolvers'

import { fileURLToPath, URL } from 'node:url'

const version = process.env.NODE_ENV === 'production' ? process.env.npm_package_version : JSON.stringify(process.env.npm_package_version)

export default defineConfig(({ command, mode }) => {
  const theEnv = loadEnv(mode, process.cwd())
  const qBittorrentPort = theEnv.VITE_QBITTORRENT_PORT ?? 8080
  const proxyTarget = theEnv.VITE_QBITTORRENT_TARGET ?? 'http://127.0.0.1'

  return {
    base: './',
    build: {
      target: 'esnext',
      rollupOptions: {
        output: {
          manualChunks: {
            vue: ['vue', 'vue-router', 'vue-router/composables', 'vuex', 'vuex-persist']
          }
        }
      },
      outDir: './vuetorrent/public'
    },
    define: {
      'import.meta.env.VITE_PACKAGE_VERSION': version,
      'process.env': {}
    },
    plugins: [
      vue(),
      Components({
        dts: false,
        directives: false,
        resolvers: [VuetifyResolver()],
        types: [
          {
            from: 'vue-router',
            names: ['RouterLink', 'RouterView']
          }
        ]
      }),
      VitePWA({
        includeAssets: [
          'favicon.ico',
          'robots.txt',
          './icons/android-chrome-192x192.png',
          './icons/android-chrome-512x512.png',
          './icons/android-chrome-maskable-192x192.png',
          './icons/android-chrome-maskable-512x512.png',
          './icons/apple-touch-icon.png',
          './icons/safari-pinned-tab.svg',
          './icons/msapplication-icon-144x144.png'
        ],
        manifest: {
          name: 'VueTorrent',
          short_name: 'VueTorrent',
          theme_color: '#597566',
          start_url: '.',
          background_color: '#000',
          icons: [
            {
              src: './icons/android-chrome-192x192.png',
              sizes: '192x192',
              type: 'image/png'
            },
            {
              src: './icons/android-chrome-512x512.png',
              sizes: '512x512',
              type: 'image/png'
            },
            {
              src: './icons/android-chrome-maskable-192x192.png',
              sizes: '192x192',
              type: 'image/png',
              purpose: 'maskable'
            },
            {
              src: './icons/android-chrome-maskable-512x512.png',
              sizes: '512x512',
              type: 'image/png',
              purpose: 'maskable'
            },

            {
              src: './icons/apple-touch-icon.png',
              sizes: '180x180',
              type: 'image/png'
            },
            {
              src: './icons/safari-pinned-tab.svg',
              sizes: '683x683',
              type: 'image/svg+xml'
            },
            {
              src: './icons/msapplication-icon-144x144.png',
              sizes: '144x144',
              type: 'image/png'
            }
          ]
        },
        // Other options
        registerType: 'autoUpdate',
        base: './',
        useCredentials: true,
        workbox: {
          skipWaiting: true,
          globPatterns: ['**/*.{js,css,html,ico,png,svg}']
        }
      })
    ],
    publicDir: './public',
    resolve: {
      alias: {
        '@': fileURLToPath(new URL('./src', import.meta.url)),
        '~': fileURLToPath(new URL('./node_modules', import.meta.url))
      },
      extensions: ['.js', '.json', '.jsx', '.ts', '.tsx', '.vue']
    },
    server: {
      proxy: {
        '/api': `${proxyTarget}:${qBittorrentPort}`
      }
    }
  }
})