// src/jobs/services/companyExpiryCheck.job.ts

import { Company } from '@/modules/company/company.model';
import User from '@/modules/user/user.model';
import dayjs from 'dayjs';
import { Status } from '@/shared/constants/enum.constant';

export const CheckExpiredCompanies = async () => {
  try {
    console.log(
      'executed at company expiry:',
      dayjs().format('YYYY-MM-DD HH:mm:ss'),
    );

    const today = dayjs().startOf('day').toDate();

    // Find companies whose plan has expired (planExpiryDate < today) and are still active
    const expiredCompanies = await Company.find({
      planExpiryDate: { $lt: today },
      status: { $ne: Status.INACTIVE },
    });

    if (expiredCompanies.length === 0) {
      console.log('No expired companies found');
      return;
    }

    console.log(
      `Found ${expiredCompanies.length} expired companies to deactivate`,
    );

    // Collect expired company IDs
    const expiredCompanyIds = expiredCompanies.map((c) => c._id);

    // Update all expired companies to inactive status
    const companyUpdateResult = await Company.updateMany(
      {
        _id: { $in: expiredCompanyIds },
        status: { $ne: Status.INACTIVE },
      },
      {
        $set: {
          status: Status.INACTIVE,
          updatedAt: new Date(),
        },
      },
    );

    console.log(
      `Successfully deactivated ${companyUpdateResult.modifiedCount} companies`,
    );

    // Update all users belonging to those companies to inactive status
    const userUpdateResult = await User.updateMany(
      {
        'company.id': { $in: expiredCompanyIds },
        status: { $ne: Status.INACTIVE },
      },
      {
        $set: {
          status: Status.INACTIVE,
          updatedAt: new Date(),
        },
      },
    );

    console.log(
      `Successfully deactivated ${userUpdateResult.modifiedCount} users of expired companies`,
    );

    // Log the companies that were deactivated
    expiredCompanies.forEach((company) => {
      console.log(
        `Deactivated company: ${company.name} (ID: ${company._id}) - Expired on: ${dayjs(
          company.planExpiryDate,
        ).format('YYYY-MM-DD')}`,
      );
    });

    return {
      success: true,
      deactivatedCompanies: companyUpdateResult.modifiedCount,
      deactivatedUsers: userUpdateResult.modifiedCount,
      expiredCompanies: expiredCompanies.map((c) => ({
        id: c._id,
        name: c.name,
        expiryDate: c.planExpiryDate,
      })),
    };
  } catch (error) {
    console.error('Error checking expired companies:', error);
    throw error;
  }
};
