import { Router } from "@fastly/expressly";

const router = new Router();

router.get("(.*)", async (req, res) => {
    // Get permission from request
    const reqPermission = await getReqPermission(req);

    // Send request and get response from backend
    const resp = await fetch(req.url, {
        backend: "origin_0",
    });

    let array_a = reqPermission.split(':').filter(Boolean);
    // Get permission from require-group response header  
    if (resp.headers.has('require-group')) {
        let requireGroup = resp.headers.get('require-group');
        let array_b = requireGroup.split(':').filter(Boolean);
        let intersectionSet = array_a.filter(item => array_b.includes(item));
        if (intersectionSet.length ==0) {
          console.log("No intersection!");
          res.sendStatus(403);
        }else{
          console.log(intersectionSet.toString());
          res.send(resp);
        }
    }else{
        console.log('No require-group header found in response');
        res.send(resp);
    } 
});

router.listen();

function getReqPermission(req) {
    const cookieVal = req.headers.get('Cookie');
    if (!cookieVal) {
        throw new Error('No cookie found');
    }
    // we split at ";" not "; ", in case the cookie is ending with ";"
    const kvPairs = cookieVal.split(';');
    const permissionKv = kvPairs.find((kv) => {
        const index = kv.indexOf('=');
        if (index === -1) {
            return false;
        }
        const key = kv.substring(0, index).trim();
        return key === 'permission';
    });
    if (!permissionKv) {
        throw new Error('No permission found in cookie');
    }
    const index = permissionKv.indexOf('=');
    const value = permissionKv.substring(index + 1);

    return value;
}