const { Supplier, FriendRequest } = require('../models/supplier');
const { User } = require('../models/User')
const boom = require("boom");
const fastify = require("fastify")({
  logger: true,
});
// const moment = require('moment');

const moment = require('moment-timezone');

// Set the timezone of the server
moment.tz.setDefault('Asia/Kolkata');
const schedule = require('node-schedule');




// Handle friend request creation

exports.friendRequest = async (request, reply) => {
  try {
    const customerId = request.body.customerId;
    const supplierId = request.body.supplierId;

    const sender = await User.findOne({ customerId: customerId });
    const receiver = await Supplier.findOne({ supplierId: supplierId });

    if (!sender || !receiver) {
      throw new Error('Sender or receiver not found');
    }

    const existingRequest = await FriendRequest.findOne({ customerId: sender.customerId, supplierId: receiver.supplierId});

    if (existingRequest) {
      existingRequest.timestamp = moment().tz('Asia/Kolkata').format("DD-MM-YYYY HH:mm:ss");

      await existingRequest.save();
      reply.send({ timestamp: existingRequest.timestamp, message: 'Friend request sent again' });
    } else {
      const timestamp =  moment().tz('Asia/Kolkata').format("DD-MM-YYYY HH:mm:ss");

      const friendRequest = new FriendRequest({
        customerId: sender.customerId,
        supplierId: receiver.supplierId,
        timestamp: timestamp
      });

      await friendRequest.save();

      // Schedule the request to be sent again in 5 hours
      const rule = new schedule.RecurrenceRule();
      rule.hour = new schedule.Range(0, 23, 5); // Run every 5 hours
      schedule.scheduleJob(rule, async function() {
        const timestamp = moment().tz('Asia/Kolkata').format("DD-MM-YYYY HH:mm:ss");
        const newFriendRequest = new FriendRequest({
          customerId: sender.customerId,
          supplierId: receiver.supplierId,
          timestamp: timestamp
        });
        await newFriendRequest.save();
      });

      reply.send({ timestamp: friendRequest.timestamp, message: 'Friend request sent' });
    }
  } catch (err) {
    reply.status(400).send({ error: err.message });
  }
};


// Handle friend request acceptance
exports.friendRequestAccept =  async (request, reply) => {
  try {
    //const {friendRequestId} = request.body;
    const {supplierId,customerId} = request.body;
    // Update the friend request status to 'accepted'
    // const friendRequest = await FriendRequest.findByIdAndUpdate(friendRequestId, { status: 'accepted' });
    const friendRequest = await FriendRequest.findOneAndUpdate({supplierId,customerId }, { status: 'accepted' });
    console.log("friendRequest....---", friendRequest)


    if (!friendRequest) {
      throw new Error('Friend request not found');
    }

    reply.send({ message: 'Friend request accepted' });
  } catch (err) {
    reply.status(400).send({ error: err.message });
  }
};


// Handle friend request rejection
exports.friendRequestReject =  async (request, reply) => {
  try {
    //const {friendRequestId} = request.body;
    const {supplierId, customerId} = request.body;
    // Update the friend request status to 'rejected'
    // const friendRequest = await FriendRequest.findByIdAndUpdate(friendRequestId, { status: 'rejected' });
    const friendRequest = await FriendRequest.findOneAndUpdate({supplierId, customerId}, { status: 'rejected' });
    console.log("friendRequest....---", friendRequest)


    if (!friendRequest) {
      throw new Error('Friend request not found');
    }

    reply.send({ message: 'Friend request rejected' });
  } catch (err) {
    reply.status(400).send({ error: err.message });
  }
};

