// @ts-check

import grabHostNames from "../utils/grab-host-names";

interface FunctionReturn {
    success: boolean;
    payload: {
        urlPath: string;
        urlThumbnailPath: string;
    } | null;
    msg?: string;
}

type Param = {
    key?: string;
    payload: {
        imageData: string;
        imageName: string;
        mimeType?: string;
        thumbnailSize?: number;
        folder?: string;
        isPrivate?: boolean;
    };
    user_id?: boolean;
};

/**
 * # Upload Image via API
 */
export default async function uploadImage({
    key,
    payload,
    user_id,
}: Param): Promise<FunctionReturn> {
    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-image`,
                },

                /**
                 * 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 as FunctionReturn;
    } catch (error: any) {
        console.log("Error in uploading image: ", error.message);

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