import express, { Request, Response } from 'express';
const router = express.Router();
import multer from 'multer';
const upload = multer();
import { getOperatorByName } from '@stirling-pdf/shared-operations/src/workflow/getOperatorByName';
import { Operator } from '@stirling-pdf/shared-operations/src/functions';

import { PdfFile } from '@stirling-pdf/shared-operations/src/wrappers/PdfFile';
import { respondWithPdfFiles } from 'utils/endpoint-utils';
import { Action } from '@stirling-pdf/shared-operations/declarations/Action';
import { JoiPDFFileSchema } from '@stirling-pdf/shared-operations/src/wrappers/PdfFileJoi';

router.post('/:func', upload.array("file"), async function(req: Request, res: Response) {
    handleEndpoint(req, res);
});

router.post('/:dir/:func', upload.array("file"), async function(req: Request, res: Response) {
    handleEndpoint(req, res);
});

function handleEndpoint(req: Request, res: Response) {
    if(!req.files || req.files.length == 0) {
        res.status(400).json({error: "no input file(s) were provided"})
        return;
    }

    const validationResults = JoiPDFFileSchema.validate(req.files);
    if(validationResults.error) {
        res.status(400).json({error: "PDF validation failed", details: validationResults.error.message});
        return;
    }
    const pdfFiles: PdfFile[] = validationResults.value;

    const operator = getOperatorByName(req.params.func);
    if(operator) {
        const action: Action = {type: req.params.func, values: req.body};

        const validationResults = operator.schema.validate({input: pdfFiles, values: action.values});

        if(validationResults.error) {
            res.status(400).json({error: "Value validation failed", details: validationResults.error.message});
        }
        else {
            action.values = validationResults.value.values;
            const operation = new operator(action);

            operation.run(validationResults.value.input, (progress) => {}).then(pdfFiles => {
                respondWithPdfFiles(res, pdfFiles, req.params.func + "_result");
            })
        }
    }
    else {
        res.status(400).json({error: `the operator of type ${req.params.func} does not exist`})
    }
}

export default router;