import { Injectable, Logger } from '@nestjs/common';
import { Cron } from '@nestjs/schedule';
import { QuestionnaireReminderService } from './questionnaire-reminder.service';
import { CronReportService } from '../mailer/cron-report.service';

@Injectable()
export class QuestionnaireReminderCronService {
  private readonly logger = new Logger(QuestionnaireReminderCronService.name);

  constructor(
    private readonly questionnaireReminderService: QuestionnaireReminderService,
    private readonly cronReportService: CronReportService,
  ) {}

  @Cron('0 9 * * *', {
    name: 'sendQuestionnaireReminders',
    timeZone: 'Europe/Paris',
  })
  async sendQuestionnaireReminders(): Promise<void> {
    const startTime = new Date();
    this.logger.log('Starting daily questionnaire reminder cron job...');

    let error: Error | null = null;
    let statistics: Record<string, unknown> | undefined;

    try {
      const result = await this.questionnaireReminderService.processQuestionnaireReminders();

      statistics = {
        totalSubmissions: result.totalSubmissions,
        remindersToSend: result.remindersToSend,
        smsSent: result.smsSent,
        smsFailed: result.smsFailed,
      };

      this.logger.log(
        'Daily questionnaire reminder cron job completed successfully',
      );

      const endTime = new Date();
      const duration = endTime.getTime() - startTime.getTime();

      // Envoyer le compte-rendu
      await this.cronReportService.sendReport({
        jobName: 'sendQuestionnaireReminders',
        startTime,
        endTime,
        duration,
        status: 'success',
        statistics,
        details: `Traitement des rappels de questionnaire terminé avec succès. ${result.smsSent} SMS envoyés, ${result.smsFailed} échecs.`,
        sentMessages: result.sentMessages,
      });
    } catch (err) {
      error = err instanceof Error ? err : new Error(String(err));
      this.logger.error('Error in questionnaire reminder cron job:', error);
      
      const endTime = new Date();
      const duration = endTime.getTime() - startTime.getTime();

      // Envoyer le compte-rendu d'erreur
      await this.cronReportService.sendReport({
        jobName: 'sendQuestionnaireReminders',
        startTime,
        endTime,
        duration,
        status: 'error',
        error: error.message,
      });
    }
  }

  // Méthode pour tester manuellement l'envoi de rappels
  async testReminderSending(simulateDate?: Date): Promise<void> {
    this.logger.log(
      `Testing questionnaire reminder sending${simulateDate ? ` with simulated date: ${simulateDate.toISOString()}` : ''}...`,
    );

    try {
      await this.questionnaireReminderService.processQuestionnaireReminders(
        simulateDate,
      );
      this.logger.log(
        'Test questionnaire reminder sending completed successfully',
      );
    } catch (error) {
      this.logger.error(
        'Error during test questionnaire reminder sending:',
        error,
      );
      throw error;
    }
  }
}
