const bodyParser = require("body-parser");
const urlParse = require("url").parse;
import { Application, Request as ERequest } from "express";
import { Logger } from "../logging";
import { RequestOptions } from "@talentsoft-opensource/integration-widget-contract";

import { requestExternalResource } from "./requestExternalResource";
import { downloadExternalResource } from "./downloadExternalResource";
import { SecurityMode } from "../securityModes/securityMode";

export function setupProxy(app: Application, logger: Logger) {
    function logRequest(req: ERequest) {
        logger.info(`incoming request - ${req.method} - ${req.url}`);
    }

    app.use(bodyParser.text({ type: '*/*'}));
    
    app.all("/proxy", async function(req, res, next) {
        logRequest(req);
        const query = urlParse(req.url, true).query;
        const { url, secretkey, login } = query;
        const securitymode: SecurityMode =
            query.securitymode || "directconnect";
        if (!url || !secretkey || !login) {
            res.sendStatus(400).json({
                error:
                    "Missing querystring parameter. You must provide url, secretKey, login and securityMode"
            });
            return;
        }
        try {
            const options: RequestOptions = {
                url,
                verb: req.method as any, // no solution for the moment :-(
                body: req.body,
                headers: req.headers as Record<string, string>
            };
            const result = await requestExternalResource(
                options,
                secretkey,
                login,
                securitymode
            );
            await res.json(result);
        } catch (err) {
            logger.error(err);
            next(err);
        }
    });

    app.all("/download", async function(req, res, next) {
        const query = urlParse(req.url, true).query;
        const { url, secretkey, login } = query;
        const securitymode: SecurityMode =
            query.securitymode || "directconnect";
        if (!url || !secretkey || !login) {
            res.sendStatus(400).json({
                error:
                    "Missing querystring parameter. You must provide url, secretKey, login and securityMode"
            });
            return;
        }
        try {
            const options: RequestOptions = {
                url,
                verb: req.method as any, // no solution for the moment :-(
                body: req.body,
                headers: req.headers as Record<string, string>
            };
            const result = await downloadExternalResource(
                options,
                secretkey,
                login,
                securitymode
            );
            res.set('Content-Type', result.headers["content-type"]);
            res.set('Content-Disposition', result.headers["content-disposition"]);
            return res.send(Buffer.from(result.body));
        } catch (err) {
            logger.error(err);
            next(err);
        }
    });
}
