// @ts-check

const serverError = require("./serverError");

/**
 * # Add User Table to Database
 *
 * @param {object} params
 * @param {Object<string,any>} [params.data]
 * @param {string[]} [params.fields]
 * @param {Object<string,any>} [params.excludeData]
 * @param {import("../../types").DSQL_FieldSchemaType[]} [params.excludeFields]
 *
 * @returns {import("../../types").DSQL_FieldSchemaType[]} new user auth object payload
 */
module.exports = function grabSchemaFieldsFromData({
    data,
    fields,
    excludeData,
    excludeFields,
}) {
    try {
        const possibleFields = require("../../data/possibleFields.json");
        const dataTypes = require("../../data/dataTypes.json");

        /** @type {import("../../types").DSQL_FieldSchemaType[]} */
        const finalFields = [];

        /** @type {string[]} */
        let filteredFields = [];

        if (data && Object.keys(data)?.[0]) {
            filteredFields = Object.keys(data);
        }

        if (fields) {
            filteredFields = [...filteredFields, ...fields];
            filteredFields = [...new Set(filteredFields)];
        }

        filteredFields = filteredFields
            .filter(
                (fld) => !excludeData || !Object.keys(excludeData).includes(fld)
            )
            .filter(
                (fld) =>
                    !excludeFields ||
                    !excludeFields.find((exlFld) => exlFld.fieldName == fld)
            );

        filteredFields.forEach((fld) => {
            const value = data ? data[fld] : null;

            if (typeof value == "string") {
                const newField =
                    /** @type {import("../../types").DSQL_FieldSchemaType} */ ({
                        fieldName: fld,
                        dataType: value.length > 255 ? "TEXT" : "VARCHAR(255)",
                    });

                if (Boolean(value.match(/<[^>]+>/g))) {
                    newField.richText = true;
                }

                finalFields.push(newField);
            } else if (typeof value == "number") {
                finalFields.push(
                    /** @type {import("../../types").DSQL_FieldSchemaType} */ ({
                        fieldName: fld,
                        dataType: "INT",
                    })
                );
            } else {
                finalFields.push(
                    /** @type {import("../../types").DSQL_FieldSchemaType} */ ({
                        fieldName: fld,
                        dataType: "VARCHAR(255)",
                    })
                );
            }
        });

        return finalFields;
    } catch (/** @type {any} */ error) {
        console.log(`grabSchemaFieldsFromData.js ERROR: ${error.message}`);

        serverError({
            component: "grabSchemaFieldsFromData.js",
            message: error.message,
        });

        return [];
    }
};