import { TaskStatus } from '@/types/types';
import { differenceInDays, isAfter, isBefore, isSameDay } from 'date-fns';

export const getTaskStatus = (
  startDate: Date | null,
  dueDate: Date | null,
  completedAt: Date | null
): TaskStatus => {
  const now = new Date();

  // Si la tâche est terminée
  if (completedAt) {
    return TaskStatus.COMPLETED;
  }

  // Si la date d'échéance est dépassée
  if (dueDate && isBefore(dueDate, now)) {
    return TaskStatus.OVERDUE;
  }

  // Si la date de début est aujourd'hui ou dans le futur
  if (startDate && (isSameDay(startDate, now) || isAfter(startDate, now))) {
    return TaskStatus.IN_PROGRESS;
  }

  // Par défaut, la tâche est en attente
  return TaskStatus.PENDING;
};

export const calculateTaskDuration = (
  startDate: Date | null,
  completedAt: Date | null,
  dueDate: Date | null
): { duration: string; appreciation: string; appreciationColor: string } => {
  if (!startDate || !completedAt) {
    return {
      duration: 'indéterminée',
      appreciation: '',
      appreciationColor: 'text-gray-500'
    };
  }

  const durationInDays = differenceInDays(completedAt, startDate);
  const duration = `${durationInDays} jour${durationInDays > 1 ? 's' : ''}`;

  if (!dueDate) {
    return {
      duration,
      appreciation: 'Tâche terminée',
      appreciationColor: 'text-gray-500'
    };
  }

  // Comparer la date de terminaison avec la date d'échéance
  if (isBefore(completedAt, dueDate)) {
    // Tâche terminée avant l'échéance - TRÈS BONNE APPRÉCIATION (VERT)
    return {
      duration,
      appreciation: 'Félicitations ! Tâche accomplie en avance sur le délai prévu.',
      appreciationColor: 'text-green-600 font-semibold'
    };
  } else if (isSameDay(completedAt, dueDate)) {
    // Tâche terminée le jour de l'échéance - BONNE APPRÉCIATION (JAUNE)
    return {
      duration,
      appreciation: 'Tâche accomplie dans les délais. Bon travail !',
      appreciationColor: 'text-yellow-600 font-semibold'
    };
  } else {
    // Tâche terminée après l'échéance - APPRÉCIATION NÉGATIVE (ROUGE)
    return {
      duration,
      appreciation: 'Tâche terminée en retard. À améliorer pour les prochaines tâches.',
      appreciationColor: 'text-red-600 font-semibold'
    };
  }
};

export const getTaskAppreciation = (
  task: any
): { appreciation: string; appreciationColor: string } => {
  // Si la tâche n'est pas terminée
  if (task.status !== 'COMPLETED' || !task.completedAt) {
    if (task.status === 'OVERDUE') {
      return {
        appreciation: 'Tâche en retard. Veuillez la compléter dès que possible.',
        appreciationColor: 'text-red-600 font-semibold'
      };
    } else if (task.status === 'PENDING') {
      return {
        appreciation: 'En attente de début.',
        appreciationColor: 'text-gray-500'
      };
    } else if (task.status === 'IN_PROGRESS') {
      return {
        appreciation: 'En cours d\'exécution.',
        appreciationColor: 'text-blue-600'
      };
    }
    return {
      appreciation: '-',
      appreciationColor: 'text-gray-500'
    };
  }

  // Si la tâche est terminée, calculer l'appréciation
  const { appreciation, appreciationColor } = calculateTaskDuration(
    task.startDate,
    task.completedAt,
    task.dueDate
  );

  return { appreciation, appreciationColor };
};

export const getTaskStatusColor = (status: TaskStatus): string => {
  switch (status) {
    case TaskStatus.PENDING:
      return 'bg-sky-100 text-sky-800'; // bleu ciel
    case TaskStatus.IN_PROGRESS:
      return 'bg-yellow-100 text-yellow-800'; // jaune
    case TaskStatus.COMPLETED:
      return 'bg-green-100 text-green-800'; // vert clair
    case TaskStatus.OVERDUE:
      return 'bg-red-100 text-red-800'; // rouge vif
    default:
      return 'bg-gray-100 text-gray-800';
  }
};

export const shouldShowDeadlineWarning = (dueDate: Date | null): boolean => {
  if (!dueDate) return false;
  
  const now = new Date();
  const hoursUntilDeadline = differenceInDays(dueDate, now);
  
  return hoursUntilDeadline <= 1 && hoursUntilDeadline > 0;
}; 