package com.persagy.dmp.rwd.parser.entity;

import cn.hutool.core.collection.CollUtil;
import com.fasterxml.jackson.annotation.JsonAlias;
import com.persagy.dmp.common.model.data.RegionValue;
import lombok.Data;

import java.util.ArrayList;
import java.util.List;

/**
 * 区间数据
 * @param <T> 数据泛型
 * @author Charlie Yu
 * @date 2021-07-12
 */
@Data
public class RegionVO<T extends Comparable> {

    /** 大于 */
    @JsonAlias(value = "$gt")
    public T great;
    /** 大于等于 */
    @JsonAlias(value = "$gte")
    public T greatEqual;
    /** 小于 */
    @JsonAlias(value = "$lt")
    public T less;
    /** 小于等于 */
    @JsonAlias(value = "$lte")
    public T lessEqual;

    public RegionVO() {
    }

    public RegionVO(T great, T greatEqual, T less, T lessEqual) {
        this.great = great;
        this.greatEqual = greatEqual;
        this.less = less;
        this.lessEqual = lessEqual;
    }

    /**
     * 是否为空
     * @return
     */
    public boolean isEmpty() {
        return great == null && greatEqual == null && less == null && lessEqual == null;
    }

    /**
     * 转换为RegionValue
     * @return
     */
    public RegionValue<T> toRegionValue() {
        RegionValue region = new RegionValue();
        // 区间开始赋值
        if(great != null) {
            if(greatEqual == null || great.compareTo(greatEqual) >= 0) {
                region.setStart(great);
                region.setContainStart(false);
            } else {
                region.setStart(greatEqual);
                region.setContainStart(true);
            }
        } else {
            // 只有大于等于
            if(greatEqual != null) {
                region.setStart(greatEqual);
                region.setContainStart(true);
            }
        }
        // 区间结束赋值
        if(less != null) {
            if(lessEqual == null || less.compareTo(lessEqual) <= 0) {
                region.setEnd(less);
                region.setContainEnd(false);
            } else {
                region.setEnd(lessEqual);
                region.setContainEnd(true);
            }
        } else {
            // 只有小于等于
            if(lessEqual != null) {
                region.setEnd(lessEqual);
                region.setContainEnd(true);
            }
        }
        return region;
    }

    /**
     * 转换为RegionValue
     * @param values
     * @param <T>
     * @return
     */
    public static <T extends Comparable> List<RegionValue<T>> toRegionValueList(List<RegionVO<T>> values) {
        if(CollUtil.isEmpty(values)) {
            return null;
        }
        List<RegionValue<T>> regionList = new ArrayList<>();
        for(RegionVO<T> value:values) {
            regionList.add(value.toRegionValue());
        }
        return regionList;
    }
}
