import mongoose from 'mongoose';
import connectToDatabase from '@/shared/config/dbConfig';
import { Lead } from '@/modules/lead/lead.model';
import { Activity } from '@/modules/activity/activity.model';
import { Tasks } from '@/modules/tasks/tasks.model';
import { TaskActivityType } from '@/modules/tasks/tasks.constant';

/**
 * Migration script to populate totalActivity field in activityCounts
 * Calculates counts from Activity table and updates lead records
 */
export const migrateTotalActivity = async () => {
  try {
    console.log('Starting totalActivity migration from Activity table...');

    // Get all leads
    const leads = await Lead.find({}).select('_id').lean();
    console.log(`Found ${leads.length} leads to process`);

    let updatedCount = 0;
    let errorCount = 0;

    for (const lead of leads) {
      try {
        const leadId = lead._id;

        // Get all activities for this lead (not just completed)
        const allActivities = await Activity.find({
          lead: leadId,
        })
          .select('type task status')
          .lean();

        // Get task IDs for schedule activities
        const taskIds = allActivities
          .map((a: any) => a.task)
          .filter(Boolean);

        // Fetch tasks to determine activity type for schedules
        const tasksById = new Map<string, any>();
        if (taskIds.length) {
          const tasks = await Tasks.find({ _id: { $in: taskIds } })
            .select('activityType')
            .lean();
          for (const t of tasks) {
            tasksById.set((t as any)._id.toString(), t);
          }
        }

        // Calculate counts
        const counts = {
          callAttempts: 0,
          meetings: 0,
          siteVisits: 0,
          totalActivity: 0,
        };

        for (const activity of allActivities as any[]) {
          if (activity.type === 'call') {
            counts.callAttempts += 1;
          } else if (activity.type === 'meeting') {
            counts.meetings += 1;
          } else if (activity.type === 'site-visit') {
            counts.siteVisits += 1;
          } else if (activity.type === 'schedule' && activity.task) {
            const task = tasksById.get(activity.task.toString());
            if (task?.activityType === TaskActivityType.MEETING) {
              counts.meetings += 1;
            } else if (task?.activityType === TaskActivityType.SITE_VISIT) {
              counts.siteVisits += 1;
            } else if (task?.activityType === TaskActivityType.CALL) {
              counts.callAttempts += 1;
            }
          }
        }

        // Calculate total activity
        counts.totalActivity = counts.callAttempts + counts.meetings + counts.siteVisits;

        // Update lead with calculated counts
        await Lead.updateOne(
          { _id: leadId },
          {
            $set: {
              activityCounts: counts,
            },
          },
        );

        updatedCount++;
        
        if (updatedCount % 100 === 0) {
          console.log(`Processed ${updatedCount}/${leads.length} leads`);
        }
      } catch (err) {
        errorCount++;
        console.error(`Error processing lead ${lead._id}:`, err);
      }
    }

    console.log(`Migration completed successfully!`);
    console.log(`Updated: ${updatedCount} leads`);
    console.log(`Errors: ${errorCount} leads`);
    
    return { updatedCount, errorCount };
  } catch (error) {
    console.error('Migration failed:', error);
    throw error;
  }
};

// Run if executed directly (ES module compatible)
if (process.argv[1]?.endsWith('migrate-total-activity.ts')) {
  (async () => {
    try {
      console.log('Connecting to MongoDB...');
      await connectToDatabase();
      console.log('Connected to MongoDB');
      
      await migrateTotalActivity();
      
      await mongoose.disconnect();
      console.log('Disconnected from MongoDB');
      process.exit(0);
    } catch (error) {
      console.error(error);
      await mongoose.disconnect();
      process.exit(1);
    }
  })();
}
