const Dinero = require("dinero.js");
const queries = require("../graphql-client/queries");
//const client = require("../graphql-client/graphql-client").client;
const logger = require("../utils/logger");
// Dinero.defaultCurrency = "USD";
// Dinero.globalLocale = "en-CA";
Dinero.globalRoundingMode = "HALF_EVEN";
const client = require("../graphql-client/graphql-client").client;

async function StatusTransition(req, res) {
  const { id: jobid, status: value, shopid: bodyshopid } = req.body.event.data.new;

  // Create record OPEN on new item, enter state
  // If change to SCHEDULE, update the last record and create a new record (update status and end time on old record,
  // create a new record saying we came from previous status going to previous status
  // (Timeline)
  // Final status is exported, there is no end date as there is no further transition (has no end date)
  try {
    const { update_transitions } = await client.request(queries.UPDATE_OLD_TRANSITION, {
      jobid: jobid,
      existingTransition: {
        end: new Date(),
        next_value: value

        //duration
      }
    });

    let duration =
      update_transitions.affected_rows === 0
        ? 0
        : new Date(update_transitions.returning[0].end) - new Date(update_transitions.returning[0].start);

    const resp2 = await client.request(queries.INSERT_NEW_TRANSITION(update_transitions.affected_rows > 0), {
      ...(update_transitions.affected_rows > 0
        ? {
            oldTransitionId: update_transitions.affected_rows === 0 ? null : update_transitions.returning[0].id,
            duration
          }
        : {}),
      newTransition: {
        bodyshopid: bodyshopid,
        jobid: jobid,
        start: update_transitions.affected_rows === 0 ? new Date() : update_transitions.returning[0].end,
        prev_value: update_transitions.affected_rows === 0 ? null : update_transitions.returning[0].value,
        value: value,
        type: "status"
      }
    });

    logger.log("job-transition-update-result", "DEBUG", null, jobid, resp2);

    //Check to see if there is an existing status transition record.
    //Query using Job ID, start is not null, end is null.

    //If there is no existing record, this is the start of the transition life cycle.
    // Create the initial transition record.

    //If there is a current status transition record, update it with the end date, duration, and next value.

    res.sendStatus(200); //.json(ret);
  } catch (error) {
    logger.log("job-status-transition-error", "ERROR", req.user?.email, jobid, {
      message: error.message,
      stack: error.stack
    });

    res.status(400).send(JSON.stringify(error));
  }
}

exports.statustransition = StatusTransition;
