import cookie from "cookie";

addEventListener('fetch', (event) => event.respondWith(handleRequest(event)));

async function handleRequest(event) {
  let req = event.request;
  let url = new URL(req.url);
  const targetMethod = ['GET', 'HEAD'];

  // Parse and set session id in the cookie to header and remove cookie
  var cookies = cookie.parse(req.headers.get("cookie"));
  
  if (cookies.sessionid) {
    req.headers.set('auth-sessionid',cookies.sessionid);
  }

  req.headers.delete('cookie');
  
  const backendResponseInit = await fetch(req, {
    backend: 'origin_0',
  });

  const payWall = backendResponseInit.headers.get('paywall');

  console.log("paywall:" + payWall);

  // Evaluate paywall header in the response
  if (payWall || targetMethod.includes(req.method)) {
    if (!isValidUrl(payWall)) {
      return new Response("Invalid paywall check URL", { status: 403 });
    }
    const payWallCheckPending = new URL(payWall);
    if (payWallCheckPending.hostname = "fiddle-paywall.glitch.me") {

      // Set paywall check URL for new request
      let reqCheck = new Request(payWallCheckPending.toString());

      const backendResponseCheck = await fetch(reqCheck, {
        backend: 'origin_1',
      });

      const payWallResult = backendResponseCheck.headers.get('Paywall-Result');
      const payWallMeta = backendResponseCheck.headers.get('Paywall-Meta');

      console.log("paywall-result:" + payWallResult);
      console.log("paywall-meta:" + payWallMeta);

    // Evaluate Paywall-Result header
      if (payWallResult) {
        if (payWallResult == "BLOCK") {
          return new Response("This content is only available to premium subscribers", { status: 403 });
        }

        // Set set-cookie header
        if (payWallMeta) {
          backendResponseInit.headers.set('set-cookie', "paywall-meta=" + payWallMeta + "; path=/; max-age=10");
        }
      }
    }
  }
  // Deliver contents in cases of other than GET/HEAD, no paywall, unknown paywall target or no block of paywall check rersult
    return backendResponseInit;
}

function isValidUrl(string) {
  try {
    new URL(string);
    return true;
  } catch (err) {
    return false;
  }
}