// @ts-check

const fs = require("fs");
const path = require("path");
const { execSync } = require("child_process");
const serverError = require("./serverError");
const DB_HANDLER = require("../../utils/backend/global-db/DB_HANDLER");
const { default: grabUserSchemaData } = require("./grabUserSchemaData");
const { default: setUserSchemaData } = require("./setUserSchemaData");
const addDbEntry = require("./db/addDbEntry");
const createDbFromSchema = require("../../shell/createDbFromSchema");
const LOCAL_DB_HANDLER = require("../../utils/backend/global-db/LOCAL_DB_HANDLER");
const grabNewUsersTableSchema = require("./grabNewUsersTableSchema");

/**
 * # Add User Table to Database
 *
 * @param {object} params
 * @param {number} params.userId - user id
 * @param {string} params.database
 * @param {boolean} [params.useLocal]
 * @param {Object<string, any>} [params.payload] - payload object
 *
 * @returns {Promise<any>} new user auth object payload
 */
module.exports = async function addUsersTableToDb({
    userId,
    database,
    useLocal,
    payload,
}) {
    try {
        const dbFullName = database;

        const userPreset = grabNewUsersTableSchema({ payload });
        if (!userPreset) throw new Error("Couldn't Get User Preset!");

        const userSchemaData = grabUserSchemaData({ userId });
        if (!userSchemaData) throw new Error("User schema data not found!");

        let targetDatabase = userSchemaData.find(
            (db) => db.dbFullName === database
        );

        if (!targetDatabase) {
            throw new Error("Couldn't Find Target Database!");
        }

        let existingTableIndex = targetDatabase?.tables.findIndex(
            (table) => table.tableName === "users"
        );

        if (typeof existingTableIndex == "number" && existingTableIndex > 0) {
            targetDatabase.tables[existingTableIndex] = userPreset;
        } else {
            targetDatabase.tables.push(userPreset);
        }

        setUserSchemaData({ schemaData: userSchemaData, userId });

        /** @type {any[] | null} */
        const targetDb = useLocal
            ? await LOCAL_DB_HANDLER(
                  `SELECT id FROM user_databases WHERE user_id=? AND db_slug=?`,
                  [userId, database]
              )
            : await DB_HANDLER(
                  `SELECT id FROM user_databases WHERE user_id=? AND db_slug=?`,
                  [userId, database]
              );

        if (targetDb?.[0]) {
            const newTableEntry = await addDbEntry({
                dbFullName: "datasquirel",
                tableName: "user_database_tables",
                data: {
                    user_id: userId,
                    db_id: targetDb[0].id,
                    db_slug: targetDatabase.dbSlug,
                    table_name: "Users",
                    table_slug: "users",
                },
                useLocal,
            });
        }

        const dbShellUpdate = await createDbFromSchema({
            userId,
            targetDatabase: dbFullName,
        });

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

        serverError({
            component: "addUsersTableToDb",
            message: error.message,
            user: { id: userId },
        });
        return error.message;
    }
};
