require("isomorphic-fetch");
const invariant = require("invariant");

const CloudflareEmail = process.env.CLOUDFLARE_EMAIL;
const CloudflareKey = process.env.CLOUDFLARE_KEY;
const RayID = process.argv[2];

invariant(
  CloudflareEmail,
  "Missing the $CLOUDFLARE_EMAIL environment variable"
);

invariant(CloudflareKey, "Missing the $CLOUDFLARE_KEY environment variable");

invariant(
  RayID,
  "Missing the RAY_ID argument; use `heroku run node show-log.js RAY_ID`"
);

function getZones(domain) {
  return fetch(`https://api.cloudflare.com/client/v4/zones?name=${domain}`, {
    method: "GET",
    headers: {
      "X-Auth-Email": CloudflareEmail,
      "X-Auth-Key": CloudflareKey
    }
  })
    .then(res => res.json())
    .then(data => data.result);
}

function getLog(zoneId, rayId) {
  return fetch(
    `https://api.cloudflare.com/client/v4/zones/${zoneId}/logs/requests/${rayId}`,
    {
      method: "GET",
      headers: {
        "X-Auth-Email": CloudflareEmail,
        "X-Auth-Key": CloudflareKey
      }
    }
  ).then(res => (res.status === 404 ? "NOT FOUND" : res.json()));
}

getZones("unpkg.com").then(zones => {
  getLog(zones[0].id, RayID).then(entry => {
    console.log(entry);
  });
});