import { APIGatewayProxyHandlerV2 } from 'aws-lambda';
import * as aws from 'aws-sdk';

const stepfunctions = new aws.StepFunctions();

export const pipelineApprovalAction: APIGatewayProxyHandlerV2 = async (event, _context, callback) => {
    console.info(`Receiving pipeline approval action event ${JSON.stringify(event, null, 2)}.`);

    // workaround to disable slack link auto preview
    // https://slack.com/help/articles/204399343-Share-links-and-set-preview-preferences
    if (event.requestContext.http.userAgent.indexOf('Slackbot') > -1) {
        return {
            statusCode: 401,
            body: `This url does not support Slack LinkExpanding.`,
        };
    }

    var message = {};

    const action = event.queryStringParameters?.action;

    if (action === "approve") {
        message = { "Status": "Approved" };
    } else if (action === "reject") {
        message = { "Status": "Rejected" };
    } else {
        console.error(`Unrecognized action "${action}". Expected: approve, reject.`);
        return {
            statusCode: 400,
            body: `Failed to process the request. Unrecognized Action "${action}".`,
        };
    }

    const taskToken = event.queryStringParameters!.taskToken;
    const statemachineName = event.queryStringParameters!.sm;
    const executionName = event.queryStringParameters!.ex;

    try {
        await stepfunctions.sendTaskSuccess({
            output: JSON.stringify(message),
            taskToken: taskToken,
        }).promise();
    } catch (err) {
        console.error(err, err.stack);
        return {
            statusCode: 500,
            body: err.message,
        }
    }
      
    return { 
        statusCode: 200,
        body: `Deployment pipeline "${statemachineName}" with execution "${executionName}" is ${action === 'approve' ? 'approved' : 'rejected'}.`,
    };
}