package com.hpay.hpay_mobile_api.services;



import com.hpay.hpay_mobile_api.DTO.DepotRetraitDTO;
import com.hpay.hpay_mobile_api.entities.DepotRetrait;
import com.hpay.hpay_mobile_api.entities.Sochitel;
import com.hpay.hpay_mobile_api.repositories.DepotRetraitRepository;
import com.hpay.hpay_mobile_api.repositories.SochitelRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.data.domain.*;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Optional;

@Service
@RequiredArgsConstructor
public class DepotRetraitService {

    private final DepotRetraitRepository repository;
    private final SochitelRepository sochitelRepository;

    public DepotRetrait save(DepotRetrait depotRetrait) {
        return repository.save(depotRetrait);
    }

    public Optional<DepotRetrait> findById(Integer id) {
        return repository.findById(id);
    }

    public List<DepotRetrait> findAll() {
        return repository.findAll();
    }

    public void deleteById(Integer id) {
        repository.deleteById(id);
    }

    public List<DepotRetrait> findByClient(Integer idClient) {
        return repository.findByIdClients(idClient);
    }

    public List<DepotRetrait> findByCompte(Integer idCompte) {
        return repository.findByIdCompte(idCompte);
    }

    public List<DepotRetrait> findByNumTransaction(String numTransaction) {
        return repository.findByNumTransaction(numTransaction);
    }



    public Page<DepotRetraitDTO> searchDepotsService(
            Integer idClient,
            Integer idCompte,
            LocalDateTime dateStart,
            LocalDateTime dateEnd,
            int page,
            int size,
            String sortDirection
    ) {
        Sort sort = Sort.by("dateTransaction");
        sort = "DESC".equalsIgnoreCase(sortDirection) ? sort.descending() : sort.ascending();

        Pageable pageable = PageRequest.of(page, size, sort);

        Page<DepotRetrait> depots = repository.searchDepots(idClient, idCompte, dateStart, dateEnd, pageable);

        return depots.map(d -> DepotRetraitDTO.builder()
                .id(d.getId())
                .montant(d.getMontant())
                .frais(d.getFrais())
                .total(d.getTotal())
                .dateTransaction(d.getDateTransaction())
                .typeAction(d.getTypeAction())
                .clientId(d.getClient().getId())
                .clientCode(d.getClient().getClientCode())
                .nom(d.getClient().getNom())
                .prenoms(d.getClient().getPrenoms())
                .telephone(d.getClient().getTelephone())
                .email(d.getClient().getEmail())
                .urlPhoto(d.getClient().getPhotoClient())
                .compteId(d.getCompte().getIdCompte())
                .numCompte(d.getCompte().getNumCompte())
                .devise(d.getCompte().getDevise())
                .build()
        );
    }


    public Page<DepotRetraitDTO> searchRetraitsService(
            Integer idClient,
            Integer idCompte,
            LocalDateTime dateStart,
            LocalDateTime dateEnd,
            int page,
            int size,
            String sortDirection
    ) {
        Sort sort = Sort.by("dateTransaction");
        sort = "DESC".equalsIgnoreCase(sortDirection) ? sort.descending() : sort.ascending();

        Pageable pageable = PageRequest.of(page, size, sort);

        Page<DepotRetrait> depots = repository.searchRetraits(idClient, idCompte, dateStart, dateEnd, pageable);

        return depots.map(d -> DepotRetraitDTO.builder()
                .id(d.getId())
                .montant(d.getMontant())
                .frais(d.getFrais())
                .total(d.getTotal())
                .dateTransaction(d.getDateTransaction())
                .typeAction(d.getTypeAction())
                .clientId(d.getClient().getId())
                .clientCode(d.getClient().getClientCode())
                .nom(d.getClient().getNom())
                .prenoms(d.getClient().getPrenoms())
                .telephone(d.getClient().getTelephone())
                .email(d.getClient().getEmail())
                .urlPhoto(d.getClient().getPhotoClient())
                .compteId(d.getCompte().getIdCompte())
                .numCompte(d.getCompte().getNumCompte())
                .devise(d.getCompte().getDevise())
                .build()
        );
    }



   /* public Page<Sochitel> searchSochitelService(Long idClient,
                                          Long idCompte,
                                          LocalDateTime dateStart,
                                          LocalDateTime dateEnd,
                                          Pageable pageable) {
        return sochitelRepository.findSochitelTransactions(idClient, idCompte, dateStart, dateEnd, pageable);
    }*/







}
