const { isObject } = require("lodash");

const jobUpdated = async (req, res) => {
  const { ioRedis, logger, ioHelpers } = req;
  // Old Way
  if (req?.body?.event?.data?.new || isObject(req?.body?.event?.data?.new)) {
    const updatedJob = req.body.event.data.new;
    const bodyshopID = updatedJob.shopid;
    ioRedis.to(ioHelpers.getBodyshopRoom(bodyshopID)).emit("production-job-updated", updatedJob);
    return res.json({ message: "Job updated and event emitted" });
  }

  // New way
  if (!req?.body?.data || !isObject(req.body.data)) {
    logger.log("job-update-error", "ERROR", req.user?.email, null, {
      message: `Malformed Job Update request sent from Hasura`,
      body: req?.body
    });

    return res.json({
      status: "error",
      message: `Malformed Job Update request sent from Hasura`
    });
  }

  // Uncomment for further testing
  // You can also test this using SocketIOAdmin
  // logger.log("job-update", "DEBUG", req.user?.email, null, {
  //   message: `Job updated event received from Hasura`,
  //   jobid: req?.body?.event?.data?.new?.id
  // });

  const updatedJob = req.body.data;
  const bodyshopID = updatedJob.shopid;

  // Emit the job-updated event only to the room corresponding to the bodyshop
  ioRedis.to(ioHelpers.getBodyshopRoom(bodyshopID)).emit("production-job-updated", updatedJob);

  return res.json({ message: "Job updated and event emitted" });
};

module.exports = jobUpdated;
