package com.hpay.hpay_mobile_api.QuerySpecifications;


import com.hpay.hpay_mobile_api.entities.VirementInterne;
import jakarta.persistence.criteria.Predicate;
import org.springframework.data.jpa.domain.Specification;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

public class VirementInterneSpecification {

    public static Specification<VirementInterne> withFilters(
            Long idClient,
            Long idCompte,
            LocalDateTime startDate,
            LocalDateTime endDate
    ) {
        return (root, query, cb) -> {

            List<Predicate> predicates = new ArrayList<>();

            if (idClient != null) {
                Predicate fromPredicate = cb.equal(root.get("idClientFrom"), idClient);
                Predicate toPredicate = cb.equal(root.get("idClientTo"), idClient);
                Predicate finalPredicate = cb.or(fromPredicate, toPredicate);
                predicates.add(finalPredicate );
            }

            if (idCompte != null) {
                Predicate fromComptePredicate = cb.equal(root.get("idCompteFrom"), idCompte);
                Predicate toComptePredicate = cb.equal(root.get("idCompteTo"), idCompte);
                Predicate finalComptePredicate = cb.or(fromComptePredicate, toComptePredicate);
                predicates.add(finalComptePredicate);
            }

            if (startDate != null && endDate != null) {
                predicates.add(cb.between(root.get("dateInitiale"), startDate, endDate));
            } else if (startDate != null) {
                predicates.add(cb.greaterThanOrEqualTo(root.get("dateInitiale"), startDate));
            } else if (endDate != null) {
                predicates.add(cb.lessThanOrEqualTo(root.get("dateInitiale"), endDate));
            }


            return cb.and(predicates.toArray(new Predicate[0]));
        };
    }
}

