"use strict";
var __importDefault = (this && this.__importDefault) || function (mod) {
    return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.default = logoutUser;
const get_auth_cookie_names_1 = __importDefault(require("../package-shared/functions/backend/cookies/get-auth-cookie-names"));
const decrypt_1 = __importDefault(require("../package-shared/functions/dsql/decrypt"));
const ejson_1 = __importDefault(require("../package-shared/utils/ejson"));
const write_auth_files_1 = require("../package-shared/functions/backend/auth/write-auth-files");
const parseCookies_1 = __importDefault(require("../package-shared/utils/backend/parseCookies"));
/**
 * # Logout user
 */
function logoutUser({ response, database, dsqlUserId, encryptedUserString, request, cookieString, }) {
    /**
     * Check Encryption Keys
     *
     * @description Check Encryption Keys
     */
    try {
        const cookieNames = (0, get_auth_cookie_names_1.default)({
            database,
            userId: dsqlUserId || process.env.DSQL_API_USER_ID,
        });
        const authKeyName = cookieNames.keyCookieName;
        const csrfName = cookieNames.csrfCookieName;
        const oneTimeCodeName = (0, get_auth_cookie_names_1.default)().oneTimeCodeName;
        const decryptedUserJSON = (() => {
            try {
                if (request) {
                    const cookiesObject = (0, parseCookies_1.default)({
                        request,
                        cookieString,
                    });
                    return (0, decrypt_1.default)({
                        encryptedString: cookiesObject[authKeyName],
                    });
                }
                else if (encryptedUserString) {
                    return (0, decrypt_1.default)({
                        encryptedString: encryptedUserString,
                    });
                }
                else {
                    return undefined;
                }
            }
            catch ( /** @type {any} */error) {
                console.log("Error getting decrypted User JSON to logout:", error.message);
                return undefined;
            }
        })();
        if (!decryptedUserJSON)
            throw new Error("Invalid User");
        const userObject = ejson_1.default.parse(decryptedUserJSON);
        if (!(userObject === null || userObject === void 0 ? void 0 : userObject.csrf_k))
            throw new Error("Invalid User. Please check key");
        response === null || response === void 0 ? void 0 : response.setHeader("Set-Cookie", [
            `${authKeyName}=null;max-age=0`,
            `${csrfName}=null;max-age=0`,
            `${oneTimeCodeName}=null;max-age=0`,
        ]);
        const csrf = userObject.csrf_k;
        (0, write_auth_files_1.deleteAuthFile)(csrf);
        return {
            success: true,
            msg: "User Logged Out",
            cookieNames,
        };
    }
    catch ( /** @type {any} */error) {
        console.log("Logout Error:", error.message);
        return {
            success: false,
            msg: "Logout Failed",
        };
    }
}
module.exports = logoutUser;