import { build } from "vite"
import vue from "@vitejs/plugin-vue"
import vueJsx from "@vitejs/plugin-vue-jsx"
import path from "path"
import dts from "vite-plugin-dts"
import { replaceCodePlugin } from "vite-plugin-replace";
import fs from "fs-extra";
// import libInjectCss from "./libInjectCss"
import _ from "lodash"
import { getOutput, getPath, getPkgs } from "@princess-ui/share";

export default function (prefix: string, component: string, name: string, opts?: {}) {
    const isExistVue = fs.pathExistsSync(`components/${component}/index.vue`)
    return build({
        logLevel: "error",
        plugins: [
            vue({ isProduction: true }),
            vueJsx(),
            dts({
                entryRoot: `components/${component}`,
                tsConfigFilePath: getPath("tsconfig.json"),
                outputDir: getOutput(`lib/${component}`),
                cleanVueFileName: true,
                // include: [isExistVue?`components/${component}/index.vue`:`components/${component}/${component}.vue`, `components/${component}/index.ts`],
                include: [`components/${component}`],
                staticImport: true,
            }),
            replaceCodePlugin({
                replacements: [
                    {
                        from: "@princess-ui/components",
                        to: "princess-ui/lib",
                    },
                    // 考虑使用gulp进行替换,做成element类似的结构
                    // {
                    //     from: /\@princess\-ui\/theme-chalk\/src\/(.*?)\.scss/i,
                    //     to: "princess-ui/theme-chalk/$1.css"
                    // }
                ],
            }),
            // libInjectCss(),
        ],
        build: {
            outDir: getOutput("lib"),
            cssCodeSplit: false,
            emptyOutDir: false,
            lib: {
                entry: path.resolve(__dirname, `../components/${component}/index.ts`),
                name: name,
                formats: ["es", "umd"],
                fileName: format => `${component}/index${format == 'es' ? '' : '.umd'}.js`,
            },
            rollupOptions: {
                external: id => {
                    if (/^vue/.test(id)) {
                        return true
                    }
                    if (/^princess-ui/.test(id)) {
                        return true
                    }
                    return false
                },
                output: [
                    {
                        format: "es",
                        assetFileNames(chunkInfo) {
                            if (chunkInfo.name == "style.css") {
                                return `${component}/style.css`
                            }
                        },
                    },
                    {
                        exports: "named",
                        name: name,
                        format: "umd",
                        globals: (id: string) => {
                            if (/^vue/.test(id)) {
                                return "Vue"
                            }
                            if (new RegExp(/^princess-ui\/lib/).test(id)) {
                                let str = id.replace(/^princess\-ui\/lib\//, prefix)
                                str = str.slice(0, 2) + str.slice(2)[0].toUpperCase() + str.slice(3)
                                return str
                            }
                        },
                    },
                ],
            },
        },
    })
}