import varDatabaseDbHandler from "../utils/varDatabaseDbHandler";
import { DSQL_IndexSchemaType } from "../../types";

type Param = {
    tableName: string;
    dbFullName: string;
    indexes: DSQL_IndexSchemaType[];
};

/**
 * Handle DATASQUIREL Table Indexes
 * ===================================================
 * @description Iterate through each datasquirel schema
 * table index(if available), and perform operations
 */
export default async function handleIndexescreateDbFromSchema({
    dbFullName,
    tableName,
    indexes,
}: Param) {
    for (let g = 0; g < indexes.length; g++) {
        const { indexType, indexName, indexTableFields, alias } = indexes[g];

        if (!alias?.match(/./)) continue;

        /**
         * @description Check for existing Index in MYSQL db
         */
        try {
            /**
             * @type {import("../../types").DSQL_MYSQL_SHOW_INDEXES_Type[]}
             * @description All indexes from MYSQL db
             */ // @ts-ignore
            const allExistingIndexes: import("../../types").DSQL_MYSQL_SHOW_INDEXES_Type[] =
                await varDatabaseDbHandler({
                    queryString: `SHOW INDEXES FROM \`${dbFullName}\`.\`${tableName}\``,
                });

            const existingKeyInDb = allExistingIndexes.filter(
                (indexObject) => indexObject.Key_name === alias
            );
            if (!existingKeyInDb[0])
                throw new Error("This Index Does not Exist");
        } catch (error) {
            global.ERROR_CALLBACK?.(
                `Error Handling Indexes on Creating Schema`,
                error as Error
            );

            /**
             * @description Create new index if determined that it
             * doesn't exist in MYSQL db
             */
            await varDatabaseDbHandler({
                queryString: `CREATE${
                    indexType?.match(/fullText/i) ? " FULLTEXT" : ""
                } INDEX \`${alias}\` ON \`${dbFullName}\`.\`${tableName}\`(${indexTableFields
                    ?.map((nm) => nm.value)
                    .map((nm) => `\`${nm}\``)
                    .join(",")}) COMMENT 'schema_index'`,
            });
        }
    }
}