"use strict";
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = addAdminUserOnLogin;
const serverError_1 = __importDefault(require("./serverError"));
const DB_HANDLER_1 = __importDefault(require("../../utils/backend/global-db/DB_HANDLER"));
const addDbEntry_1 = __importDefault(require("./db/addDbEntry"));
const LOCAL_DB_HANDLER_1 = __importDefault(require("../../utils/backend/global-db/LOCAL_DB_HANDLER"));
/**
 * Add Admin User on Login
 * ==============================================================================
 *
 * @description this function handles admin users that have been invited by another
 * admin user. This fires when the invited user has been logged in or a new account
 * has been created for the invited user
 */
function addAdminUserOnLogin(_a) {
    return __awaiter(this, arguments, void 0, function* ({ query, user, }) {
        var _b;
        try {
            const finalDbHandler = global.DSQL_USE_LOCAL
                ? LOCAL_DB_HANDLER_1.default
                : DB_HANDLER_1.default;
            const { invite, database_access, priviledge, email } = query;
            const lastInviteTimeQuery = `SELECT date_created_code FROM invitations WHERE inviting_user_id=? AND invited_user_email=?`;
            const lastInviteTimeValues = [invite, email];
            const lastInviteTimeArray = yield finalDbHandler(lastInviteTimeQuery, lastInviteTimeValues);
            if (!lastInviteTimeArray || !lastInviteTimeArray[0]) {
                throw new Error("No Invitation Found");
            }
            ////////////////////////////////////////////////
            ////////////////////////////////////////////////
            ////////////////////////////////////////////////
            const invitingUserDbQuery = `SELECT first_name,last_name,email FROM users WHERE id=?`;
            const invitingUserDbValues = [invite];
            const invitingUserDb = yield finalDbHandler(invitingUserDbQuery, invitingUserDbValues);
            if (invitingUserDb === null || invitingUserDb === void 0 ? void 0 : invitingUserDb[0]) {
                const existingUserUser = yield finalDbHandler(`SELECT email FROM user_users WHERE user_id=? AND invited_user_id=? AND user_type='admin' AND email=?`, [invite, user.id, email]);
                if (existingUserUser === null || existingUserUser === void 0 ? void 0 : existingUserUser[0]) {
                    console.log("User already added");
                }
                else {
                    (0, addDbEntry_1.default)({
                        dbFullName: "datasquirel",
                        tableName: "user_users",
                        data: {
                            user_id: invite,
                            invited_user_id: user.id,
                            database_access: database_access,
                            first_name: user.first_name,
                            last_name: user.last_name,
                            phone: user.phone,
                            email: user.email,
                            username: user.username,
                            user_type: "admin",
                            user_priviledge: priviledge,
                            image: user.image,
                            image_thumbnail: user.image_thumbnail,
                        },
                    });
                    ////////////////////////////////////////////////
                    ////////////////////////////////////////////////
                    ////////////////////////////////////////////////
                    const dbTableData = yield finalDbHandler(`SELECT db_tables_data FROM invitations WHERE inviting_user_id=? AND invited_user_email=?`, [invite, email]);
                    const clearEntries = yield finalDbHandler(`DELETE FROM delegated_user_tables WHERE root_user_id=? AND delegated_user_id=?`, [invite, user.id]);
                    ////////////////////////////////////////////////
                    ////////////////////////////////////////////////
                    ////////////////////////////////////////////////
                    if (dbTableData && dbTableData[0]) {
                        const dbTableEntries = dbTableData[0].db_tables_data.split("|");
                        for (let i = 0; i < dbTableEntries.length; i++) {
                            const dbTableEntry = dbTableEntries[i];
                            const dbTableEntryArray = dbTableEntry.split("-");
                            const [db_slug, table_slug] = dbTableEntryArray;
                            const newEntry = yield (0, addDbEntry_1.default)({
                                dbFullName: "datasquirel",
                                tableName: "delegated_user_tables",
                                data: {
                                    delegated_user_id: user.id,
                                    root_user_id: invite,
                                    database: db_slug,
                                    table: table_slug,
                                    priviledge: priviledge,
                                },
                            });
                        }
                    }
                }
                const inviteAccepted = yield finalDbHandler(`UPDATE invitations SET invitation_status='Accepted' WHERE inviting_user_id=? AND invited_user_email=?`, [invite, email]);
            }
        }
        catch (error) {
            (_b = global.ERROR_CALLBACK) === null || _b === void 0 ? void 0 : _b.call(global, `Add Admin User On Login Error`, error);
            (0, serverError_1.default)({
                component: "addAdminUserOnLogin",
                message: error.message,
                user: user,
            });
        }
    });
}