package cn.ztuo.bitrade.service.base;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Sort;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;

import cn.ztuo.bitrade.dto.PageParam;
import cn.ztuo.bitrade.dto.Pagenation;

import java.util.List;
import java.util.Map;
import java.util.regex.Pattern;


@Service
public class MongoBaseService<T> {

    @Autowired
    protected MongoTemplate mongoTemplate ;

    /**
     * mongodb分页排序查询
     * @param pageParam:分页参数(pageNo、pageSize、order、direction)
     * @param query
     * @param cla
     * @param collectionName
     * @return
     */
    public Pagenation page(PageParam pageParam , Query query, Class<T> cla, String collectionName ){
        if(pageParam.getOrders()!=null&&pageParam.getDirection()!=null) {
            query.with(new Sort(pageParam.getDirection(),pageParam.getOrders()));
        }
        long total  = mongoTemplate.count(query,cla,collectionName);
        query.limit(pageParam.getPageSize()).skip((pageParam.getPageNo()-1)*pageParam.getPageSize());
        List<T> list = mongoTemplate.find(query,cla,collectionName);
        long consult = total/pageParam.getPageSize() ;
        long residue = total%pageParam.getPageSize();
        long totalPage = residue == 0 ?consult :(consult+1) ;
        Pagenation pagenation = new Pagenation(pageParam);
        return pagenation.setData(list,total,totalPage);
    }

    /**
     * 条件数组
     * @param map
     * @return
     */
    public Criteria getCriteria(Map<String,Map<String,Object>> map){

        Criteria criteria = new Criteria() ;

        "1".equals(Criteria.where("1"));

        Map<String,Object> condition = map.get("eq") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                criteria.and(key).equals(condition.get(key)) ;
            }
        }
        condition = map.get("gte") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                criteria.and(key).gte(condition.get(key)) ;
            }
        }


        condition = map.get("gt") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                criteria.and(key).gt(condition.get(key)) ;
            }
        }


        condition = map.get("lte") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                criteria.and(key).lte(condition.get(key)) ;
            }
        }


        condition = map.get("lt") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                criteria.and(key).lt(condition.get(key)) ;
            }
        }

        condition = map.get("like-prefix") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                Pattern pattern = Pattern.compile("^"+condition.get(key)+".*$");
                criteria.and(key).regex(pattern) ;
            }
        }

        condition = map.get("like-suffix") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                Pattern pattern = Pattern.compile("^.*"+condition.get(key)+"$");
                criteria.and(key).regex(pattern) ;
            }
        }

        condition = map.get("like-all") ;
        if(condition!=null){
            for(String key : condition.keySet()){
                Pattern pattern = Pattern.compile("^.*"+condition.get(key)+".*$");
                criteria.and(key).regex(pattern) ;
            }
        }


        return criteria ;
    }
}