const fs = require("fs");
const path = require("path");

const rootDir = path.resolve(__dirname, "../");
const distDir = path.resolve(rootDir, "dist");
const componentPath = path.join(__dirname, "./components");

// Import project `package.json`
const pkg = require(path.resolve(rootDir, "package.json"));
const libraryName = "PrimeVue";
const libraryVersion = pkg.version;

const showcaseURL = "https://primefaces.org/primevue/showcase/#/";

const fileModules = {},
    veturTags = {},
    veturAttributes = {};

const files = fs.readdirSync(componentPath);
files.forEach(file => {
    const { name } = path.parse(file);

    fileModules[name] = require(`./components//${name}`);
});

const webTypes = {
    $schema: "https://raw.githubusercontent.com/JetBrains/web-types/master/schema/web-types.json",
    framework: "vue",
    name: libraryName,
    version: libraryVersion,
    contributions: {
        html: {
            "types-syntax": "typescript",
            "description-markup": "markdown",
            tags: [],
            attributes: []
        }
    }
};

const addURL = (attr, url, value) => {
    const newArray = [];

    attr.forEach(att => {
        const newObj = {};

        Object.keys(att).forEach(key => {
            newObj[key] = att[key];
            if (key === value) newObj["doc-url"] = url;
        });

        newArray.push(newObj);
    });

    return newArray;
};

const createWebTypes = component => {
    const url = showcaseURL + `${component["doc-url"] ? component["doc-url"] : component.name.toLowerCase()}`;

    // components
    const tag = {
        name: component.name,
        source: {
            module: libraryName,
            symbol: component.name
        },
        "doc-url": url,
        description: component.description
    };

    // directives
    const attribute = {
        name: component.name,
        source: {
            module: libraryName,
            symbol: component.name
        },
        description: component.description,
        "doc-url": url,
        value: {
            kind: "expression",
            type: "function"
        }
    };

    if (component.props) {
        tag.attributes = addURL(component.props, url, "default");
        tag.attributes.forEach(k => {
            k["value"] = {
                kind: "expression",
                type: k["type"]
            };

            delete k["type"];
        });
    }

    if (component.events) {
        tag.events = addURL(component.events, url, "name");
        tag.events.forEach(k => {
            if (k.arguments) {
                k.arguments = addURL(k.arguments, url, "name");
            }
        });
    }

    if (component.slots) {
        tag.slots = addURL(component.slots, url, "name");
    }

    if (component["vue-modifiers"]) {
        attribute.required = false;
        attribute["vue-modifiers"] = addURL(component["vue-modifiers"], url, "name");

        if (attribute["vue-modifiers"].length < 1)
            delete attribute["vue-modifiers"];

        webTypes.contributions.html.attributes.push(attribute);
    }

    webTypes.contributions.html.tags.push(tag);
};

const createVeturTags = component => {
    const attributes = [];
    if (component.props) {
        component.props.forEach(comp => {
            attributes.push(comp.name);
        });
    }
    if (attributes.length > 0) {
        veturTags[component.name] = {
            description: component.description,
            attributes
        };
    }
};

const createVeturAttributes = component => {
    if (component.props) {
        component.props.forEach(comp => {
            veturAttributes[component.name.toLowerCase() + `/${comp.name}`] = {
                description: comp.description,
                type: comp.type
            };
        });
    }
};

Object.keys(fileModules).forEach(p => {
    createWebTypes(fileModules[p][p]);
    createVeturTags(fileModules[p][p]);
    createVeturAttributes(fileModules[p][p]);
});

const webTypesJson = JSON.stringify(webTypes, null, 2);
fs.writeFileSync(path.resolve(distDir, "web-types.json"), webTypesJson);

const veturTagsJson = JSON.stringify(veturTags, null, 2);
fs.writeFileSync(path.resolve(distDir, "vetur-tags.json"), veturTagsJson);

const veturAttributesJson = JSON.stringify(veturAttributes, null, 2);
fs.writeFileSync(path.resolve(distDir, "vetur-attributes.json"), veturAttributesJson);