const path = require("path");
require("dotenv").config({
  path: path.resolve(
    process.cwd(),
    `.env.${process.env.NODE_ENV || "development"}`
  ),
});
const axios = require("axios");
const client = require("../graphql-client/graphql-client").client;
const emailer = require("../email/sendemail");
const logger = require("../utils/logger");
const moment = require("moment-timezone");
exports.taskHandler = async (req, res) => {
  try {
    const { bodyshopid, query, variables, text, to, subject, timezone } =
      req.body;
    //Run the query

    //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);
    //Massage the data
    //Send the email
    const rootElement = response[Object.keys(response)[0]]; //This element shoudl always be an array.
    let converter = require("json-2-csv");
    converter.json2csv(
      rootElement,
      (err, csv) => {
        if (err) {
          res.status(500).json(err);
        }

        emailer.sendTaskEmail({
          to,
          subject,
          text,
          attachments: [{ filename: "query.csv", content: csv }],
        });
        res.status(200).send(csv);
      },
      { emptyFieldValue: "" }
    );
  } catch (error) {
    res.status(500).json({ error: error.message, stack: error.stackTrace });
  }
};

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, "days").format(isoformat);
    case "date.7daysago":
      return moment().tz(timezone).subtract(7, "days").format(isoformat);
    case "date.tomorrow":
      return moment().tz(timezone).add(1, "day").format(isoformat);
    case "date.3daysfromnow":
      return moment().tz(timezone).add(3, "days").format(isoformat);
    case "date.7daysfromnow":
      return moment().tz(timezone).add(7, "days").format(isoformat);
    case "date.yesterdaytz":
      return moment().tz(timezone).subtract(1, "day");
    case "date.3daysagotz":
      return moment().tz(timezone).subtract(3, "days");
    case "date.7daysagotz":
      return moment().tz(timezone).subtract(7, "days");
    case "date.tomorrowtz":
      return moment().tz(timezone).add(1, "day");
    case "date.3daysfromnowtz":
      return moment().tz(timezone).add(3, "days");
    case "date.7daysfromnowtz":
      return moment().tz(timezone).add(7, "days");

    case "date.now":
      return moment().tz(timezone);
    default:
      return f;
  }
}
