package com.hpay.hpay_mobile_api.services;

import com.hpay.hpay_mobile_api.DTO.DepotRetraitDTO;
import com.hpay.hpay_mobile_api.DTO.ErrorResponse;
import com.hpay.hpay_mobile_api.DTO.SochitelResponseDto;
import com.hpay.hpay_mobile_api.QuerySpecifications.SochitelSpecification;
import com.hpay.hpay_mobile_api.entities.Compte;
import com.hpay.hpay_mobile_api.entities.DepotRetrait;
import com.hpay.hpay_mobile_api.entities.Sochitel;
import com.hpay.hpay_mobile_api.repositories.CompteRepository;
import com.hpay.hpay_mobile_api.repositories.SochitelRepository;
import com.hpay.hpay_mobile_api.DTO.SochitelRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;
import org.springframework.stereotype.Service;

import java.math.BigDecimal;
import java.time.LocalDateTime;

import org.springframework.transaction.annotation.Transactional;


@Service
@RequiredArgsConstructor
public class SochitelService {

    private final SochitelRepository sochitelRepository;

    @Autowired
    private CompteRepository compteRepository ;


   /* public Page<Sochitel> getTransactions(Long idClient,
                                          Long idCompte,
                                          LocalDateTime dateStart,
                                          LocalDateTime dateEnd,
                                          Pageable pageable) {
        return sochitelRepository.findSochitelTransactions(idClient, idCompte, dateStart, dateEnd, pageable);
    }*/



    @Transactional
    public Sochitel insert(SochitelRequest r) {



        // verification que le compte destinateur (to) existe et qu'il n'est pas suspendu ou clos
        Compte compteFrom = compteRepository.findById(Long.valueOf(r.getIdcompte())).orElse(null);
        if (compteFrom  == null || compteFrom.getCloture().equals("1") || compteFrom.getCompteSuspendu().equals("1") ) {
            return null;
        }


        Sochitel entity = Sochitel.builder()
                .idClients(r.getIdclients())
                .idCompte(r.getIdcompte())
                .montant(r.getMontant())
                .frais(r.getFrais())
                .total(r.getTotal())
                .montantDebite(r.getMontantDebite())
                .deviseDebite(r.getDeviseDebite())
                .gainClient(r.getGainClient())
                .gainParrain(r.getGainParrain())
                .gainFranchise(r.getGainFranchise())
                .gainHpay(r.getGainHpay())
                .operatorId(r.getOperatorId())
                .operatorName(r.getOperatorName())
                .operatorAmount(r.getOperatorAmount())
                .operatorReference(r.getOperatorReference())
                .operatorCurrency(r.getOperatorCurrency())
                .countryId(r.getCountryId())
                .countryName(r.getCountryName())
                .userAmount(r.getUserAmount())
                .userCurrency(r.getUserCurrency())
                .userReference(r.getUserReference())
                .productId(r.getProductId())
                .productType(r.getProductType())
                .productTypeName(r.getProductTypeName())
                .reference(r.getReference())
                .timestamp(r.getTimestamp())
                .voucherPinNumber(r.getVoucherPinNumber())
                .voucherPinSerial(r.getVoucherPinSerial())
                .voucherPinInstruction(r.getVoucherPinInstruction())
                .commande(r.getCommande())
                .balanceInitial(r.getBalanceInitial())
                .transactionAmount(r.getTransactionAmount())
                .transactionCommission(r.getTransactionCommission())
                .transactionCommissionPercentage(r.getTransactionCommissionPercentage())
                .balanceFinal(r.getBalanceFinal())
                .balanceCurrency(r.getBalanceCurrency())
                .dateEff(r.getDateEff())
                .statut(r.getStatut() == null ? "1" : r.getStatut())
                .beneficiaire(r.getBeneficiaire())
                .idAgence(r.getIdagence())
                .build();

        compteFrom.setSolde(compteFrom.getSolde().subtract(BigDecimal.valueOf(r.getTotal())));

        compteRepository.save(compteFrom);
        return sochitelRepository.save(entity);
    }


    public Page<SochitelResponseDto> getTransactions(Integer idClient,
                                                     Integer idCompte,
                                                     LocalDateTime dateStart,
                                                     LocalDateTime dateEnd,
                                                     int page,
                                                     int size,
                                                     String sortDirection) {
        Sort sort = Sort.by("dateEff");
        sort = "desc".equalsIgnoreCase(sortDirection) ? sort.descending() : sort.ascending();
        Pageable pageable = PageRequest.of(page, size, sort);

        return sochitelRepository.searchTransactions(idClient, idCompte, dateStart, dateEnd, pageable);
    }
}