import dayjs from 'dayjs';
import { sendUnitFcmNotification } from '@/modules/activity/unitBookingOrHold/unitBookingOrHold.helper';
import { UnitBookingOrHold } from '@/modules/activity/unitBookingOrHold/unitBookingOrHold.model';
import Unit from '@/modules/project/unit/unit.model';

export const checkExpiredHoldsAndNotify = async () => {
  const now = dayjs();

  const todayStart = now.startOf('day').toDate();

  const expiredHolds = await UnitBookingOrHold.find({
    action: 'hold',
    holdUntil: { $lt: todayStart },
  })
    .populate([
      { path: 'lead', select: 'contactDetails' },
      { path: 'property', select: 'title listingType _id' },
      { path: 'project', select: 'projectName _id' },
      {
        path: 'soldBy',
        select: 'company',
        populate: [{ path: 'company.id', select: 'id name' }],
      },
      {
        path: 'createdBy',
        select: 'firstName lastName phone',
      },
      {
        path: 'updatedBy',
        select: 'firstName lastName phone',
      },
      {
        path: 'unit',
        select: 'unitNumber _id',
      },
    ])
    .lean();

  const unitIds = expiredHolds
    .map((hold) => (hold as any)?.unit?._id)
    .filter(Boolean);

  if (unitIds.length) {
    await Unit.updateMany(
      { _id: { $in: unitIds }, status: 'hold' },
      { $set: { status: 'available' } },
    );
  }

  const notifyPromises = expiredHolds.map((hold) =>
    sendUnitFcmNotification(hold, true),
  );

  await Promise.all(notifyPromises);
};
