// @ts-check

const http = require("http");
const https = require("https");
const grabHostNames = require("../package-shared/utils/grab-host-names");

/**
 * @typedef {Object} FunctionReturn
 * @property {boolean} success - Did the function run successfully?
 * @property {{
 *   urlPath: string,
 * } | null} payload - Payload containing the url for the image and its thumbnail
 * @property {string} [msg] - An optional message
 */

/**
 * # Upload File via API
 * @async
 *
 * @param {Object} params - Single Param object containing params
 * @param {String} params.key - *FULL ACCESS API Key
 * @param {{
 *    fileData: string,
 *    fileName: string,
 *    mimeType?: string,
 *    folder?: string,
 *    isPrivate?: boolean
 * }} params.payload - Image Data Eg.
 * @param {boolean} [params.user_id] - User ID
 *
 * @returns { Promise<FunctionReturn> } - Return Object
 */
async function uploadImage({ key, payload, user_id }) {
    const grabedHostNames = grabHostNames();
    const { host, port, scheme } = grabedHostNames;

    try {
        /**
         * Make https request
         *
         * @description make a request to datasquirel.com
         */
        const httpResponse = await new Promise((resolve, reject) => {
            const reqPayload = JSON.stringify(payload);

            const httpsRequest = scheme.request(
                {
                    method: "POST",
                    headers: {
                        "Content-Type": "application/json",
                        "Content-Length": Buffer.from(reqPayload).length,
                        Authorization:
                            key ||
                            process.env.DSQL_FULL_ACCESS_API_KEY ||
                            process.env.DSQL_API_KEY,
                    },
                    port,
                    hostname: host,
                    path: `/api/query/${
                        user_id || grabedHostNames.user_id
                    }/add-file`,
                },

                /**
                 * Callback Function
                 *
                 * @description https request callback
                 */
                (response) => {
                    var str = "";

                    response.on("data", function (chunk) {
                        str += chunk;
                    });

                    response.on("end", function () {
                        resolve(JSON.parse(str));
                    });

                    response.on("error", (err) => {
                        reject(err);
                    });
                }
            );

            httpsRequest.write(reqPayload);
            httpsRequest.end();
        });

        /** ********************************************** */
        /** ********************************************** */
        /** ********************************************** */

        return httpResponse;
    } catch (/** @type {*} */ error) {
        /** ********************************************** */
        /** ********************************************** */
        /** ********************************************** */

        console.log("Error in uploading file: ", error.message);

        return {
            success: false,
            payload: null,
            msg: error.message,
        };
    }
}

/** ********************************************** */
/** ********************************************** */
/** ********************************************** */

module.exports = uploadImage;