import { plugifyParseCallbacks, plugifyParseEnums } from "./src/plugify/parser.js";
import { plugifyCallbacksGenerator } from "./src/ts-generator/callback.js";
import { plugifyEnumsGenerator } from "./src/ts-generator/enum.js";
import { plugifyMethodsGenerator } from "./src/ts-generator/method.js";
import { plugifyModuleGenerator } from "./src/ts-generator/module.js";
import { PlugifyPluginMetadata } from "./src/types/plugify.js";
import { writeDts } from "./src/plugify/utils.js";
import { readFileSync } from "fs";
import { plugifyNamespaceGenerator } from "./src/ts-generator/namespace.js";

/**
 * @description Use to create dts from json
 */
export const generateDTS = ({ data: { docsURL, methods: exportedMethods }, name }: { data: PlugifyPluginMetadata, name: string }, modulePrefix = ":") => {
    // todo: validate docs url?
    const docsViewer = "https://untrustedmodders.github.io/plugify-generator/?file="
    const docsToItemURL = `${docsURL}/blob/main/${name}.pplugin.in`


    const enumsMap = plugifyParseEnums(exportedMethods);
    const prototypesMap = plugifyParseCallbacks(exportedMethods);
    const callbacks = plugifyCallbacksGenerator(prototypesMap, docsViewer, docsToItemURL)
    const enums = plugifyEnumsGenerator(enumsMap)
    const methods = plugifyMethodsGenerator(exportedMethods, docsViewer, docsToItemURL)

    // Our DTS content
    return plugifyModuleGenerator([
        enums,
        plugifyNamespaceGenerator([callbacks]),
        methods,
    ], {
        name: name,
        modulePrefix
    })
}
/**
 * @description Probably, you want to use this one to read from pplugin file & create d.ts or get content (without file)
 */
export const usePlugifyParser = (ppluginPath: string, dtsFolder: string = "./", writeFile: boolean, modulePrefix?: string) => {
    const data = usePlugifyFileReader(ppluginPath)

    if (writeFile) {
        writeDts(dtsFolder, data.name, generateDTS(data, modulePrefix))
        return;
    }

    return generateDTS(data, modulePrefix)
}

/**
 * @description Use if you want read pplugin data from file
 */
export const usePlugifyFileReader = (path: string) => {
    const data = JSON.parse(readFileSync(path, 'utf8')) as PlugifyPluginMetadata;
    return usePlugifyReader(data)
}

/**
 * @description Use if you want read pplugin data from memory
 */
export const usePlugifyReader = (data: PlugifyPluginMetadata) => {
    // todo: make better plugin name parse?
    const name = data.entryPoint.replace("bin/", "")
    return { data, name }
}