import { sendWhatsAppTemplateMessage } from '@/shared/communicationAlerts/metaUtil';
import { individualProperties } from '../individualProperties';
import { Lead } from '../lead/lead.model';
import { getObjectId } from '@/shared/utils/commonHelper';
import { ICampaignDoc, UpdateCampaignBody } from './campaign.interface';

const batchSize = 100;

export async function sendBatchWhatsAppMessages(
  campaign: ICampaignDoc,
  updateData: UpdateCampaignBody,
): Promise<void> {
  const property = await individualProperties
    .findById(campaign.property)
    .populate({ path: 'configuration', select: 'name' })
    .populate({ path: 'city', select: 'name' })
    .populate({ path: 'locality', select: 'name' })
    .populate({ path: 'createdBy', select: 'firstName lastName phone' })
    .populate({ path: 'companyId', select: 'name' });

  if (!property) throw new Error('Property not found');

  for (let i = 0; i < updateData.leadIds.length; i += batchSize) {
    const batch = updateData.leadIds.slice(i, i + batchSize);

    const batchPromises = batch.map(async (userId) => {
      const user = await Lead.findById(getObjectId(userId)).select(
        'contactDetails.name contactDetails.phone',
      );
      if (!user || !user.contactDetails?.phone) return;

      const whatsappVariables = [
        user.contactDetails.name || 'User',
        property.title || '',
        property.configuration?.name || '',
        property.companyId?.name || '',
        (property.locality?.name || '') + ' ' + (property.city?.name || ''),
        `${property.createdBy?.firstName || ''} ${property.createdBy?.lastName || ''} on ${property.createdBy?.phone?.number || ''}`.trim(),
        property.companyId?.name || '',
      ];

      if (updateData.launchTime === 'immediate')
        return sendWhatsAppTemplateMessage(
          String(user.contactDetails.phone),
          campaign.whatsappTemplates,
          whatsappVariables,
          true,
          'en',
          false,
        );
    });

    // Await all send message promises concurrently inside the batch
    Promise.all(batchPromises);
  }
}
