import {
  ActiviteResponsable,
  AnomalieResponsable,
  EmpruntResponsable,
  HistoriqueResponsable,
  MaterielResponsable,
  NotificationResponsable,
  StatutCount,
} from '../repositories/responsable.repository';
import { DashboardResponsableData } from '../services/responsable.service';

export interface RepartitionStatutResponse {
  total: number;
  parStatut: Record<string, number>;
}

export interface ActiviteResponsableResponse {
  id: number;
  action: string;
  description: string;
  dateAction: Date;
  utilisateur: {
    id: number;
    nom: string;
    prenom: string;
  };
  materiel: {
    id: number;
    nom: string;
    reference: string;
  } | null;
  empruntId: number | null;
}

export interface DashboardResponsableResponse {
  kpis: {
    materiels: RepartitionStatutResponse;
    emprunts: RepartitionStatutResponse;
    anomalies: RepartitionStatutResponse;
    notificationsNonLues: number;
  };
  activiteRecente: ActiviteResponsableResponse[];
}

export interface EmpruntResponsableResponse {
  id: number;
  statut: string;
  dateEmprunt: Date;
  dateRetourPrevue: Date;
  dateRetourReelle: Date | null;
  etudiant: {
    id: number;
    nom: string;
    prenom: string;
    email: string;
    classe: string | null;
  };
  materiel: {
    id: number;
    nom: string;
    reference: string;
    statut: string;
    categorie: {
      id: number;
      nom: string;
    };
  };
}

export interface MaterielResponsableResponse {
  id: number;
  nom: string;
  marque: string;
  modele: string;
  reference: string;
  statut: string;
  etatGeneral: string;
  categorie: {
    id: number;
    nom: string;
  };
  accessoires: Array<{
    id: number;
    nom: string;
    quantiteAttendue: number;
    obligatoire: boolean;
  }>;
}

export interface AnomalieResponsableResponse {
  id: number;
  type: string;
  description: string;
  statut: string;
  detecteeAutomatiquement: boolean;
  observation: string | null;
  dateDetection: Date;
  dateResolution: Date | null;
  emprunt: {
    id: number;
    statut: string;
    dateEmprunt: Date;
    dateRetourPrevue: Date;
    dateRetourReelle: Date | null;
  };
  etudiant: {
    id: number;
    nom: string;
    prenom: string;
    email: string;
    classe: string | null;
  };
  materiel: {
    id: number;
    nom: string;
    reference: string;
    statut: string;
    categorie: {
      id: number;
      nom: string;
    };
  };
  traitePar: {
    id: number;
    nom: string;
    prenom: string;
  } | null;
}

export interface NotificationResponsableResponse {
  id: number;
  titre: string;
  message: string;
  type: string;
  lu: boolean;
  dateCreation: Date;
  anomalie: {
    id: number;
    statut: string;
    type: string;
    empruntId: number;
    materiel: {
      id: number;
      nom: string;
      reference: string;
    };
  } | null;
}

export interface HistoriqueResponsableResponse {
  id: number;
  action: string;
  description: string;
  dateAction: Date;
  utilisateur: {
    id: number;
    nom: string;
    prenom: string;
    email: string;
  };
  materiel: {
    id: number;
    nom: string;
    reference: string;
  } | null;
  empruntId: number | null;
  sallePret: {
    id: number;
    nom: string;
  } | null;
  posteEmprunt: {
    id: number;
    nom: string;
  } | null;
}

function toRepartition(rows: StatutCount[]): RepartitionStatutResponse {
  const parStatut: Record<string, number> = {};
  let total = 0;

  for (const row of rows) {
    parStatut[row.statut] = row.count;
    total += row.count;
  }

  return { total, parStatut };
}

function toActiviteResponse(activite: ActiviteResponsable): ActiviteResponsableResponse {
  return {
    id: activite.id,
    action: activite.action,
    description: activite.description,
    dateAction: activite.dateAction,
    utilisateur: {
      id: activite.utilisateur.id,
      nom: activite.utilisateur.nom,
      prenom: activite.utilisateur.prenom,
    },
    materiel: activite.materiel
      ? {
          id: activite.materiel.id,
          nom: activite.materiel.nom,
          reference: activite.materiel.reference,
        }
      : null,
    empruntId: activite.empruntId,
  };
}

export function toDashboardResponsableResponse(
  data: DashboardResponsableData,
): DashboardResponsableResponse {
  return {
    kpis: {
      materiels: toRepartition(data.materiels),
      emprunts: toRepartition(data.emprunts),
      anomalies: toRepartition(data.anomalies),
      notificationsNonLues: data.notificationsNonLues,
    },
    activiteRecente: data.activiteRecente.map(toActiviteResponse),
  };
}

export function toEmpruntResponsableResponse(
  emprunt: EmpruntResponsable,
): EmpruntResponsableResponse {
  return {
    id: emprunt.id,
    statut: emprunt.statut,
    dateEmprunt: emprunt.dateEmprunt,
    dateRetourPrevue: emprunt.dateRetourPrevue,
    dateRetourReelle: emprunt.dateRetourReelle,
    etudiant: {
      id: emprunt.utilisateur.id,
      nom: emprunt.utilisateur.nom,
      prenom: emprunt.utilisateur.prenom,
      email: emprunt.utilisateur.email,
      classe: emprunt.utilisateur.classe,
    },
    materiel: {
      id: emprunt.materiel.id,
      nom: emprunt.materiel.nom,
      reference: emprunt.materiel.reference,
      statut: emprunt.materiel.statut,
      categorie: {
        id: emprunt.materiel.categorie.id,
        nom: emprunt.materiel.categorie.nom,
      },
    },
  };
}

export function toMaterielResponsableResponse(
  materiel: MaterielResponsable,
): MaterielResponsableResponse {
  return {
    id: materiel.id,
    nom: materiel.nom,
    marque: materiel.marque,
    modele: materiel.modele,
    reference: materiel.reference,
    statut: materiel.statut,
    etatGeneral: materiel.etatGeneral,
    categorie: {
      id: materiel.categorie.id,
      nom: materiel.categorie.nom,
    },
    accessoires: materiel.accessoires.map((liaison) => ({
      id: liaison.accessoire.id,
      nom: liaison.accessoire.nom,
      quantiteAttendue: liaison.quantiteAttendue,
      obligatoire: liaison.obligatoire,
    })),
  };
}

export function toAnomalieResponsableResponse(
  anomalie: AnomalieResponsable,
): AnomalieResponsableResponse {
  return {
    id: anomalie.id,
    type: anomalie.type,
    description: anomalie.description,
    statut: anomalie.statut,
    detecteeAutomatiquement: anomalie.detecteeAutomatiquement,
    observation: anomalie.observation,
    dateDetection: anomalie.dateDetection,
    dateResolution: anomalie.dateResolution,
    emprunt: {
      id: anomalie.emprunt.id,
      statut: anomalie.emprunt.statut,
      dateEmprunt: anomalie.emprunt.dateEmprunt,
      dateRetourPrevue: anomalie.emprunt.dateRetourPrevue,
      dateRetourReelle: anomalie.emprunt.dateRetourReelle,
    },
    etudiant: {
      id: anomalie.etudiant.id,
      nom: anomalie.etudiant.nom,
      prenom: anomalie.etudiant.prenom,
      email: anomalie.etudiant.email,
      classe: anomalie.etudiant.classe,
    },
    materiel: {
      id: anomalie.materiel.id,
      nom: anomalie.materiel.nom,
      reference: anomalie.materiel.reference,
      statut: anomalie.materiel.statut,
      categorie: {
        id: anomalie.materiel.categorie.id,
        nom: anomalie.materiel.categorie.nom,
      },
    },
    traitePar: anomalie.traitePar
      ? {
          id: anomalie.traitePar.id,
          nom: anomalie.traitePar.nom,
          prenom: anomalie.traitePar.prenom,
        }
      : null,
  };
}

export function toNotificationResponsableResponse(
  notification: NotificationResponsable,
): NotificationResponsableResponse {
  return {
    id: notification.id,
    titre: notification.titre,
    message: notification.message,
    type: notification.type,
    lu: notification.lu,
    dateCreation: notification.dateCreation,
    anomalie: notification.anomalie
      ? {
          id: notification.anomalie.id,
          statut: notification.anomalie.statut,
          type: notification.anomalie.type,
          empruntId: notification.anomalie.emprunt.id,
          materiel: {
            id: notification.anomalie.materiel.id,
            nom: notification.anomalie.materiel.nom,
            reference: notification.anomalie.materiel.reference,
          },
        }
      : null,
  };
}

export function toHistoriqueResponsableResponse(
  historique: HistoriqueResponsable,
): HistoriqueResponsableResponse {
  return {
    id: historique.id,
    action: historique.action,
    description: historique.description,
    dateAction: historique.dateAction,
    utilisateur: {
      id: historique.utilisateur.id,
      nom: historique.utilisateur.nom,
      prenom: historique.utilisateur.prenom,
      email: historique.utilisateur.email,
    },
    materiel: historique.materiel
      ? {
          id: historique.materiel.id,
          nom: historique.materiel.nom,
          reference: historique.materiel.reference,
        }
      : null,
    empruntId: historique.empruntId,
    sallePret: historique.sallePret
      ? {
          id: historique.sallePret.id,
          nom: historique.sallePret.nom,
        }
      : null,
    posteEmprunt: historique.posteEmprunt
      ? {
          id: historique.posteEmprunt.id,
          nom: historique.posteEmprunt.nom,
        }
      : null,
  };
}
