const client = require("../graphql-client/graphql-client").client;
const emailer = require("../email/sendemail");
const moment = require("moment-timezone");
const converter = require("json-2-csv");
const logger = require("../utils/logger");

exports.taskHandler = async (req, res) => {
  try {
    const { query, variables, text, to, subject, timezone } = req.body;

    //Check the variables to see if they are an object.
    Object.keys(variables).forEach((key) => {
      if (typeof variables[key] === "object") {
        if (variables[key].function) {
          variables[key] = functionMapper(variables[key].function, timezone);
        }
      }
    });

    const response = await client.request(query, variables);
    const rootElement = response[Object.keys(response)[0]]; //This element should always be an array.

    const csv = converter.json2csv(rootElement, { emptyFieldValue: "" });

    emailer
      .sendTaskEmail({
        to,
        subject,
        text,
        attachments: [{ filename: "query.csv", content: csv }]
      })
      .catch((error) => {
        logger.log("Tasks - Error sending CSV EMAIL", "error", req?.user?.email, null, {
          error
        });
      });

    return res.status(200).send(csv);
  } catch (error) {
    res.status(500).json({ error: error.message, stack: error.stack });
  }
};

const isoFormat = "YYYY-MM-DD";

function functionMapper(f, timezone) {
  switch (f) {
    case "date.today":
      return moment().tz(timezone).format(isoFormat);
    case "date.now":
      return moment().tz(timezone);
    case "date.yesterday":
      return moment().tz(timezone).subtract(1, "day").format(isoFormat);
    case "date.3daysago":
      return moment().tz(timezone).subtract(3, "day").format(isoFormat);
    case "date.7daysago":
      return moment().tz(timezone).subtract(7, "day").format(isoFormat);
    case "date.tomorrow":
      return moment().tz(timezone).add(1, "day").format(isoFormat);
    case "date.3daysfromnow":
      return moment().tz(timezone).add(3, "day").format(isoFormat);
    case "date.7daysfromnow":
      return moment().tz(timezone).add(7, "day").format(isoFormat);
    case "date.yesterdaytz":
      return moment().tz(timezone).subtract(1, "day");
    case "date.3daysagotz":
      return moment().tz(timezone).subtract(3, "day");
    case "date.7daysagotz":
      return moment().tz(timezone).subtract(7, "day");
    case "date.tomorrowtz":
      return moment().tz(timezone).add(1, "day");
    case "date.3daysfromnowtz":
      return moment().tz(timezone).add(3, "day");
    case "date.7daysfromnowtz":
      return moment().tz(timezone).add(7, "day");
    default:
      return f;
  }
}
