const router = require("express").Router();
const { MasterModel } = require("./model/master");
const mongoose = require("mongoose");
const { OrderModel } = require("./model/order");

router.post("/masters/list", async (req, res, next) => {
  try {
    const { startDate, endDate } = req.body;

    if (!startDate || !endDate) {
      throw new Error("Missing startDate or endDate");
    }

    const start = new Date(startDate);
    const end = new Date(endDate);
    const masters = await MasterModel.find({});

    const orders = await OrderModel.find({
      $or: [
        { startWashTime: { $lt: end }, endWashTime: { $gt: start } }
      ]
    });

    const mastersWithOrders = masters.map((master) => {
      const masterOrders = orders.filter((order) => {
        return (
          order?.master && order.master.toString() === master._id.toString()
        );
      });

      const schedule = masterOrders.map((order) => ({
        id: order._id,
        startWashTime: order.startWashTime,
        endWashTime: order.endWashTime,
      }));

      return {
        id: master._id,
        name: master.name,
        schedule: schedule,
        phone: master.phone,
      };
    });

    res.status(200).send({ success: true, body: mastersWithOrders });
  } catch (error) {
    next(error);
  }
});

router.delete("/masters/:id", async (req, res, next) => {
  const { id } = req.params;

  if (!mongoose.Types.ObjectId.isValid(id)) {
    throw new Error("ID is required");
  }

  try {
    const master = await MasterModel.findByIdAndDelete(id, {
      new: true,
    });
    if (!master) {
      throw new Error("master not found");
    }
    res.status(200).send({ success: true, body: master });
  } catch (error) {
    next(error);
  }
});

router.post("/masters", async (req, res, next) => {
  const { name, phone } = req.body;

  if (!name || !phone) {
    throw new Error("Enter name and phone");
  }
  try {
    const master = await MasterModel.create({ name, phone });
    res.status(200).send({ success: true, body: master });
  } catch (error) {
    next(error);
  }
});

router.patch("/masters/:id", async (req, res, next) => {
  const { id } = req.params;

  if (!mongoose.Types.ObjectId.isValid(id)) {
    throw new Error("ID is required");
  }

  const { name, phone } = req.body;

  if (!name && !phone) {
    throw new Error("Enter name and phone");
  }

  try {
    const updateData = {};
    if (name) updateData.name = name;
    if (phone) updateData.phone = phone;

    const master = await MasterModel.findByIdAndUpdate(id, updateData, {
      new: true,
    });

    if (!master) {
      throw new Error("master not found");
    }

    res.status(200).send({ success: true, body: master });
  } catch (error) {
    next(error);
  }
});

module.exports = router;