package dev.lions.unionflow.server.mapper;

import dev.lions.unionflow.server.api.dto.solidarite.request.CreateDemandeAideRequest;
import dev.lions.unionflow.server.api.dto.solidarite.request.UpdateDemandeAideRequest;
import dev.lions.unionflow.server.api.dto.solidarite.response.DemandeAideResponse;
import dev.lions.unionflow.server.api.enums.solidarite.PrioriteAide;
import dev.lions.unionflow.server.entity.DemandeAide;
import dev.lions.unionflow.server.entity.Membre;
import dev.lions.unionflow.server.entity.Organisation;
import jakarta.enterprise.context.ApplicationScoped;

/**
 * Mapper entre l'entité DemandeAide et le DTO DemandeAideDTO.
 *
 * @author UnionFlow Team
 * @version 1.0
 * @since 2026-01-31
 */
@ApplicationScoped
public class DemandeAideMapper {

  /**
   * Convertit une entité DemandeAide en DTO Response.
   */
  public DemandeAideResponse toDTO(DemandeAide entity) {
    if (entity == null) {
      return null;
    }
    DemandeAideResponse dto = new DemandeAideResponse();
    dto.setId(entity.getId());
    dto.setDateCreation(entity.getDateCreation());
    dto.setDateModification(entity.getDateModification());
    dto.setVersion(entity.getVersion() != null ? entity.getVersion() : 0L);
    dto.setActif(entity.getActif());

    dto.setTitre(entity.getTitre());
    dto.setDescription(entity.getDescription());
    dto.setTypeAide(entity.getTypeAide());
    dto.setStatut(entity.getStatut());
    dto.setMontantDemande(entity.getMontantDemande());
    dto.setMontantApprouve(entity.getMontantApprouve());
    dto.setJustification(entity.getJustification());
    dto.setCommentairesEvaluateur(entity.getCommentaireEvaluation());
    dto.setDocumentsJoints(entity.getDocumentsFournis());

    dto.setDateSoumission(entity.getDateDemande());
    dto.setDateEvaluation(entity.getDateEvaluation());
    dto.setDateVersement(entity.getDateVersement());

    dto.setPriorite(entity.getUrgence() != null && entity.getUrgence()
        ? PrioriteAide.URGENTE
        : PrioriteAide.NORMALE);

    if (entity.getDemandeur() != null) {
      dto.setMembreDemandeurId(entity.getDemandeur().getId());
      dto.setNomDemandeur(entity.getDemandeur().getPrenom() + " " + entity.getDemandeur().getNom());
      dto.setNumeroMembreDemandeur(entity.getDemandeur().getNumeroMembre());
    }
    if (entity.getEvaluateur() != null) {
      dto.setEvaluateurId(entity.getEvaluateur().getId().toString());
      dto.setEvaluateurNom(entity.getEvaluateur().getPrenom() + " " + entity.getEvaluateur().getNom());
    }
    if (entity.getOrganisation() != null) {
      dto.setAssociationId(entity.getOrganisation().getId());
      dto.setNomAssociation(entity.getOrganisation().getNom());
    }

    return dto;
  }

  /**
   * Met à jour une entité existante à partir du DTO UpdateRequest.
   */
  public void updateEntityFromDTO(DemandeAide entity, UpdateDemandeAideRequest request) {
    if (entity == null || request == null) {
      return;
    }
    if (request.titre() != null) {
      entity.setTitre(request.titre());
    }
    if (request.description() != null) {
      entity.setDescription(request.description());
    }
    if (request.typeAide() != null) {
      entity.setTypeAide(request.typeAide());
    }
    if (request.statut() != null) {
      entity.setStatut(request.statut());
    }
    entity.setMontantDemande(request.montantDemande());
    entity.setMontantApprouve(request.montantApprouve());
    entity.setJustification(request.justification());
    entity.setCommentaireEvaluation(request.commentairesEvaluateur());
    entity.setDocumentsFournis(request.documentsJoints());
    entity.setUrgence(request.priorite() != null && request.priorite().isUrgente());
    if (request.dateSoumission() != null) {
      entity.setDateDemande(request.dateSoumission());
    }
    entity.setDateEvaluation(request.dateEvaluation());
    entity.setDateVersement(request.dateVersement());
  }

  /**
   * Crée une nouvelle entité à partir du DTO CreateRequest.
   */
  public DemandeAide toEntity(
      CreateDemandeAideRequest request,
      Membre demandeur,
      Membre evaluateur,
      Organisation organisation) {
    if (request == null) {
      return null;
    }
    DemandeAide entity = new DemandeAide();
    entity.setTitre(request.titre());
    entity.setDescription(request.description());
    entity.setTypeAide(request.typeAide());
    entity.setStatut(dev.lions.unionflow.server.api.enums.solidarite.StatutAide.EN_ATTENTE);
    entity.setMontantDemande(request.montantDemande());
    entity.setJustification(request.justification());
    entity.setUrgence(request.priorite() != null && request.priorite().isUrgente());

    entity.setDateDemande(java.time.LocalDateTime.now());

    entity.setDemandeur(demandeur);
    entity.setEvaluateur(evaluateur);
    entity.setOrganisation(organisation);

    return entity;
  }
}
