package com.hpay.hpay_mobile_api.services;
import com.hpay.hpay_mobile_api.DTO.ErrorResponse;
import com.hpay.hpay_mobile_api.DTO.SuccessResponse;
import com.hpay.hpay_mobile_api.entities.*;
import com.hpay.hpay_mobile_api.repositories.*;
import jakarta.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.*;
import java.util.stream.Collectors;


@Service
public class BeneficiaireService {

    @Autowired
    private LoginClientRepository loginClientRepository;

    @Autowired
    private ClientRepository clientRepository;

    @Autowired
    private BeneficiaireRepository beneficiaireRepository;


    @Autowired
    private ClientService clientService;


    @Transactional
    public Object AddBenef(Long idClient, Long idBeneficiaire)  {

        LoginClient loginClient = loginClientRepository.findById(idClient).orElse(null);
        LoginClient loginBeneficiaire  = loginClientRepository.findById(idBeneficiaire).orElse(null);
        Date currentDate = new Date();

        if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
        }

        if (loginBeneficiaire == null ) {
            return new ErrorResponse("Beneficiaire not found", 404);
        }

        Beneficiaire existingBeneficiaire = beneficiaireRepository.findByClientIdAndBeneficiaireId(loginClient.getClient().getId(), loginBeneficiaire.getClient().getId()).orElse(null);

        if (existingBeneficiaire != null) {
            // Si la relation existe déjà,
            System.out.println("trouver");
            return new ErrorResponse("Already added", 404);
        }

        Beneficiaire beneficiaire = new Beneficiaire();
        beneficiaire.setClient(loginClient.getClient());
        beneficiaire.setBeneficiaire(loginBeneficiaire.getClient());
        beneficiaire.setDateAjout(currentDate);
        beneficiaireRepository.save(beneficiaire);

        List<Beneficiaire> beneficiaires =  beneficiaireRepository.findByClientId(loginClient.getClient().getId());
        List<HashMap> list= new ArrayList<>();


        for (Beneficiaire benef : beneficiaires) {
            HashMap<String, Object> map1 = new HashMap<>();
            map1.put("id",benef.getBeneficiaire().getId() );
            map1.put("telephone",benef.getBeneficiaire().getTelephone());
            map1.put("nom",benef.getBeneficiaire().getNom());
            map1.put("prenoms",benef.getBeneficiaire().getPrenoms());
            map1.put("sexe",benef.getBeneficiaire().getSexe());
            map1.put("compte",benef.getBeneficiaire().getComptes());
            map1.put("photo",benef.getBeneficiaire().getPhotoClient());
            list.add(map1);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",list);


        return new SuccessResponse("beneficiary successfully added", 200, map );

    }


    // Lister les bénéficiaires d'un client
    public Object getBeneficiaires(Long idClient) {

        LoginClient loginClient = loginClientRepository.findById(idClient).orElse(null);
        if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
        }

        List<Beneficiaire> beneficiaires =  beneficiaireRepository.findByClientId(loginClient.getClient().getId());
        List<HashMap> list= new ArrayList<>();


        for (Beneficiaire benef : beneficiaires) {
            HashMap<String, Object> map1 = new HashMap<>();
            map1.put("id",benef.getBeneficiaire().getId() );
            map1.put("telephone",benef.getBeneficiaire().getTelephone());
            map1.put("nom",benef.getBeneficiaire().getNom());
            map1.put("prenoms",benef.getBeneficiaire().getPrenoms());
            map1.put("sexe",benef.getBeneficiaire().getSexe());
            map1.put("compte",benef.getBeneficiaire().getComptes());
            map1.put("photo",benef.getBeneficiaire().getPhotoClient());
            list.add(map1);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",list);
        return new SuccessResponse("beneficiary successfully added", 200, map );
    }


    @Transactional
    public Object removeBeneficiaire(Long clientId, Long beneficiaireId) {

        Beneficiaire existingBeneficiaire = beneficiaireRepository.findByClientIdAndBeneficiaireId(clientId, beneficiaireId).orElse(null);

        if (existingBeneficiaire == null) {
            // Si la relation existe déjà,
            System.out.println("trouver");
            return new ErrorResponse("not Found", 404);
        }

        beneficiaireRepository.delete(existingBeneficiaire);
        List<Beneficiaire> beneficiaires =  beneficiaireRepository.findByClientId(clientId);
        List<HashMap> list= new ArrayList<>();


        for (Beneficiaire benef : beneficiaires) {
            HashMap<String, Object> map1 = new HashMap<>();
            map1.put("id",benef.getBeneficiaire().getId() );
            map1.put("telephone",benef.getBeneficiaire().getTelephone());
            map1.put("nom",benef.getBeneficiaire().getNom());
            map1.put("prenoms",benef.getBeneficiaire().getPrenoms());
            map1.put("sexe",benef.getBeneficiaire().getSexe());
            map1.put("compte",benef.getBeneficiaire().getComptes());
            map1.put("photo",benef.getBeneficiaire().getPhotoClient());
            list.add(map1);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",list);
        return new SuccessResponse("beneficiary successfully added", 200, map );

    }


    @Transactional
    public Object  getContactsClient(Long clientId, List<Integer> phones) {

        LoginClient loginClient = loginClientRepository.findById(clientId).orElse(null);
        if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
        }


        // list des id des client deja dans beneficiaire
        List<Beneficiaire> beneficiaires = beneficiaireRepository.findBeneficiariesByClientId(loginClient.getClient().getId());
        List<Long> dbBenefIdList = new ArrayList<Long>();
        for (Beneficiaire benef : beneficiaires){
            dbBenefIdList.add(benef.getBeneficiaire().getId());
        }

        //System.out.println("les ids de la bd");
        //System.out.println(dbBenefIdList);


        List<Long> benefIdList = clientService.getClientIdsByPhoneNumbers(phones);

        //System.out.println("les ids de mon repertoire");
        //System.out.println(benefIdList);


        // Filtrer les clients qui ne sont pas dans la liste des bénéficiaires
        List<Client> benefList= benefIdList.stream()
                .filter(clientIdInList -> !dbBenefIdList.contains(clientIdInList))
                .map(clientIdInList -> clientRepository.findById(clientIdInList).orElse(null))
                .filter(client -> client != null)
                .collect(Collectors.toList());


        List<HashMap> list= new ArrayList<>();
        for (Client client : benefList) {
            HashMap<String, Object> map1 = new HashMap<>();
            map1.put("id",client.getId() );
            map1.put("telephone",client.getTelephone());
            map1.put("nom",client.getNom());
            map1.put("prenoms",client.getPrenoms());
            map1.put("sexe",client.getSexe());
            map1.put("compte",client.getComptes());
            map1.put("photo",client.getPhotoClient());
            list.add(map1);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",list);
        return new SuccessResponse("Additional client to add", 200, map );

    }

    @Transactional
    public Object addBeneficiairesToClient(Long loginClientId, List<Integer> beneficiaireIds) {

        LoginClient loginClient = loginClientRepository.findById(loginClientId).orElse(null);
        if (loginClient == null) {
            return new ErrorResponse("Client not found", 404);
        }




        // Parcourir la liste des IDs de bénéficiaires et ajouter chacun à ce client
        for (Integer beneficiaireId : beneficiaireIds) {

           Client beneficiaireClient = clientRepository.findById(Long.valueOf(beneficiaireId))
                    .orElse(null);

           Beneficiaire existingBeneficiaire = beneficiaireRepository.findByClientIdAndBeneficiaireId(loginClient.getClient().getId(), Long.valueOf(beneficiaireId) ).orElse(null);

           // si n'existe pas encore
            if (existingBeneficiaire == null && beneficiaireClient!=null ) {
                // Créer un nouvel objet Beneficiaire
                Beneficiaire beneficiaire = new Beneficiaire();
                beneficiaire.setClient(loginClient.getClient());
                beneficiaire.setBeneficiaire(beneficiaireClient);
                beneficiaire.setDateAjout(new java.util.Date());

                // Sauvegarder le bénéficiaire dans la base de données
                beneficiaireRepository.save(beneficiaire);
                System.out.println("added "+ beneficiaireIds);
            }


        }


        // preparation de la reponse
        List<Beneficiaire> beneficiaires =  beneficiaireRepository.findByClientId(loginClient.getClient().getId());
        List<HashMap> list= new ArrayList<>();
        for (Beneficiaire benef : beneficiaires) {
            HashMap<String, Object> map1 = new HashMap<>();
            map1.put("id",benef.getBeneficiaire().getId() );
            map1.put("telephone",benef.getBeneficiaire().getTelephone());
            map1.put("nom",benef.getBeneficiaire().getNom());
            map1.put("prenoms",benef.getBeneficiaire().getPrenoms());
            map1.put("sexe",benef.getBeneficiaire().getSexe());
            map1.put("compte",benef.getBeneficiaire().getComptes());
            map1.put("photo",benef.getBeneficiaire().getPhotoClient());
            list.add(map1);
        }

        HashMap<String, Object> map = new HashMap<>();
        map.put("data",list);
        return new SuccessResponse("beneficiary successfully added", 200, map );
    }




}



