package com.app.Dto;

import java.util.HashSet;
import java.util.Set;

import com.app.Entity.Affaire;
import com.app.Entity.Enfant;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class AffaireDto {
	private long id;
	private String idaff;
	private String nvProjet; //oui ou nn nouveau projet
	private String statut;
	private String origine;
	private String dateEffet;
	private String dateSignature;

	private SouscriptionDto souscriptionDto;       //oneToOne
	private AssureDto assureDto;                    //ManyToOne
	//@Nullable
	private ConjointDto conjointDto;
	//ManyToOne

	private Set <EnfantDto> enfantsDto;

	public boolean hasConjoint() {
        return conjointDto != null;
    }


	public static AffaireDto fromEntity(Affaire affaire) {

		AffaireDto affaireDtoo=new AffaireDto();
		affaireDtoo.setId(affaire.getId());
		affaireDtoo.setIdaff(affaire.getIdaff());

				affaireDtoo.setNvProjet(affaire.getNvProjet());
				affaireDtoo.setStatut(affaire.getStatut());
				affaireDtoo.setOrigine(affaire.getOrigine());
				affaireDtoo.setDateEffet(affaire.getDateEffet());
				affaireDtoo.setDateSignature(affaire.getDateSignature());
				affaireDtoo.setSouscriptionDto(SouscriptionDto.fromEntity(affaire.getSouscription()));

				affaireDtoo.setAssureDto(AssureDto.fromEntity(affaire.getAssure()));
			if(affaire.getConjoint()!=null) {
					affaireDtoo.setConjointDto(ConjointDto.FromEntity(affaire.getConjoint()));
				} else {
				affaireDtoo.setConjointDto(null);
			}
				if(affaire.getEnfants()!=null) {
				Set<EnfantDto> enfants = new HashSet();
				for(Enfant enf: affaire.getEnfants()) {
					EnfantDto enfantDto = EnfantDto.fromEntity(enf);
					enfants.add(enfantDto);
				}
				affaireDtoo.setEnfantsDto(enfants);
				} else {
					affaireDtoo.setEnfantsDto(null);
				}
				//affaireDto.setEnfants(EnfantDto.fromEntity(affaire.getEnfants()));
				return affaireDtoo;

				/*affaireDto = new AffaireDto();
		BeanUtils.copyProperties(affaire, affaireDto);
		affaireDto.setAssureDto(AssureDto.fromEntity(affaire.getAssure()));
		//if(affaire.getConjoint()!=null) {

		affaireDto.setConjointDto(ConjointDto.FromEntity(affaire.getConjoint()));
		//}
		affaireDto.setSouscriptionDto(SouscriptionDto.fromEntity(affaire.getSouscription()));


		Set<EnfantDto> enfants = new HashSet();
		for(Enfant enf: affaire.getEnfants()) {
			EnfantDto enfantDto = EnfantDto.fromEntity(enf);
			enfants.add(enfantDto);
		}
		affaireDto.setEnfants(enfants);

		//affaireDto.setEnfants(EnfantDto.fromEntity(affaire.getEnfants()));
		return affaireDto;*/

	}

	public static Affaire toEntity(AffaireDto request) {
		Affaire affaire=new Affaire();
		affaire.setId(request.getId());
		affaire.setIdaff(request.getIdaff());

		affaire.setNvProjet(request.getNvProjet());
		affaire.setStatut(request.getStatut());
				affaire.setOrigine(request.getOrigine());
				affaire.setDateEffet(request.getDateEffet());
				affaire.setDateSignature(request.getDateSignature());
				affaire.setSouscription(SouscriptionDto.toEntity(request.getSouscriptionDto()));

				affaire.setAssure(AssureDto.toEntity(request.getAssureDto()));
				if(request.getConjointDto()!=null) {
					affaire.setConjoint(ConjointDto.toEntity(request.getConjointDto()));
				} else {
					affaire.setConjoint(null);
				}


				if(request.getEnfantsDto()!=null) {
				Set<Enfant> enfants = new HashSet();
				for(EnfantDto enf: request.getEnfantsDto()) {
					Enfant enfant = EnfantDto.toEntity(enf);
					enfants.add(enfant);
				}
				affaire.setEnfants(enfants);
				} else {
					affaire.setEnfants(null);
				}
				//affaireDto.setEnfants(EnfantDto.fromEntity(affaire.getEnfants()));
				return affaire;


	}


	public static Affaire toEntity(AffaireDto dto, Affaire existingAffaire) {
		 	existingAffaire.setDateEffet(dto.getDateEffet());
		    existingAffaire.setNvProjet(dto.getNvProjet());
		    existingAffaire.setIdaff(dto.getIdaff());
		    existingAffaire.setOrigine(dto.getOrigine());
		    existingAffaire.setStatut(dto.getStatut());
		    existingAffaire.setDateSignature(dto.getDateSignature());
		    // Mapper d'autres propriétés si nécessaire
		    return existingAffaire;
	}



}
