package {{packageName}}.core.{{entity.module}}.filter;

import java.math.BigDecimal;
import java.math.BigInteger;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.HashMap;

import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
import com.fasterxml.jackson.databind.ser.std.ToStringSerializer;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.*;
import lombok.experimental.Accessors;
import lombok.extern.slf4j.Slf4j;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.alibaba.fastjson.annotation.JSONField;

import org.springframework.util.ObjectUtils;
import org.springframework.util.StringUtils;
{{#entity.enableES}}
import org.elasticsearch.index.query.QueryBuilders;
{{/entity.enableES}}
import cn.ibizlab.util.filter.QueryWrapperContext;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import {{packageName}}.core.{{entity.module}}.domain.{{entity.codeName}};
/**
 * 关系型数据实体[{{entity.codeName}}] 查询条件对象
 */
@Slf4j
@Getter
@Setter
@NoArgsConstructor
@Accessors(chain = true)
@ApiModel("{{entity.logicName}}")
public class {{entity.codeName}}SearchContext extends QueryWrapperContext<{{entity.codeName}}> {

    {{#each entity.fields as |field|}}
            {{#each field.allPSDEFSearchModes as |formitem|}}
                    {{#if (or (eq formitem.valueOP "IN") (eq formitem.valueOP "ISNULL") (eq formitem.valueOP "ISNOTNULL"))}}
    @JsonProperty("{{lowerCase formitem.name}}")
    @JSONField(name = "{{lowerCase formitem.name}}")
                    {{else}}
    @JsonProperty("{{lowerCase formitem.name}}")
                        {{#timeType}}
    @JsonFormat(pattern = "{{format}}", locale = "zh", timezone = "GMT+8")
                        {{/timeType}}
    @JSONField(name = "{{lowerCase formitem.name}}"{{#timeType}} , format = "{{format}}"{{/timeType}})
                        {{#eq type.java "Long"}}
    @JsonSerialize(using = ToStringSerializer.class)            
                        {{/eq}}
                    {{/if}}
    @ApiModelProperty("{{field.logicName}}{{formitem.valueOP}}")
	private {{#if (or (eq formitem.valueOP "IN") (eq formitem.valueOP "ISNULL") (eq formitem.valueOP "ISNOTNULL"))}}String{{else}}{{field.type.java}}{{/if}} {{camelCase field.codeName}}{{formitem.valueOP}};
	public {{entity.codeName}}SearchContext set{{pascalCase field.codeName}}{{formitem.valueOP}}({{#if (or (eq formitem.valueOP "IN") (eq formitem.valueOP "ISNULL") (eq formitem.valueOP "ISNOTNULL"))}}String{{else}}{{field.type.java}}{{/if}} {{camelCase field.codeName}}{{formitem.valueOP}}) {
        this.{{camelCase field.codeName}}{{formitem.valueOP}} = {{camelCase field.codeName}}{{formitem.valueOP}};
        if(!ObjectUtils.isEmpty(this.{{camelCase field.codeName}}{{formitem.valueOP}})){
                    {{#eq formitem.valueOP "LIKE"}}
            this.getSearchCond().like("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "LEFTLIKE"}}
            this.getSearchCond().likeRight("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "RIGHTLIKE"}}
            this.getSearchCond().likeLeft("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "EQ"}}
            this.getSearchCond().eq("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "NOTEQ"}}
            this.getSearchCond().ne("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "GT"}}
            this.getSearchCond().gt("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "GTANDEQ"}}
            this.getSearchCond().ge("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "LT"}}
            this.getSearchCond().lt("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "LTANDEQ"}}
            this.getSearchCond().le("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}});
                    {{/eq}}
                    {{#eq formitem.valueOP "ISNOTNULL"}}
			if(this.{{camelCase field.codeName}}{{formitem.valueOP}}.equals("1")){
				this.getSearchCond().isNotNull("{{lowerCase field.name}}");
			}
                    {{/eq}}
                    {{#eq formitem.valueOP "ISNULL"}}
			if(this.{{camelCase field.codeName}}{{formitem.valueOP}}.equals("1")){
				this.getSearchCond().isNull("{{lowerCase field.name}}");
			}
                    {{/eq}}
                    {{#eq formitem.valueOP "IN"}}
			this.getSearchCond().in("{{lowerCase field.name}}",this.{{camelCase field.codeName}}{{formitem.valueOP}}.split(";|,|；|，"));
                    {{/eq}}
                    {{#eq formitem.valueOP "NOTIN"}}
			this.getSearchCond().notIn("{{lowerCase field.name}}",this.{{camelCase field.codeName}}{{formitem.valueOP}}.split(";|,|；|，"));
                    {{/eq}} 
            {{#if entity.enableES}}
                    {{#eq formitem.valueOP "LIKE"}}
            this.getEsCond().must(QueryBuilders.wildcardQuery("{{lowerCase field.name}}", String.format("*%s*",{{camelCase field.codeName}}{{formitem.valueOP}})));
                    {{/eq}}
                    {{#eq formitem.valueOP "LEFTLIKE"}}
            this.getEsCond().must(QueryBuilders.wildcardQuery("{{lowerCase field.name}}", String.format("%s*",{{camelCase field.codeName}}{{formitem.valueOP}})));
                    {{/eq}}
                    {{#eq formitem.valueOP "RIGHTLIKE"}}
            this.getEsCond().must(QueryBuilders.wildcardQuery("{{lowerCase field.name}}", String.format("*%s",{{camelCase field.codeName}}{{formitem.valueOP}})));
                    {{/eq}}
                    {{#eq formitem.valueOP "EQ"}}
            this.getEsCond().must(QueryBuilders.termQuery("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "NOTEQ"}}
            this.getEsCond().mustNot(QueryBuilders.termQuery("{{lowerCase field.name}}", {{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "GT"}}
            this.getEsCond().must(QueryBuilders.rangeQuery("{{lowerCase field.name}}").gt({{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "GTANDEQ"}}
            this.getEsCond().must(QueryBuilders.rangeQuery("{{lowerCase field.name}}").gte({{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "LT"}}
            this.getEsCond().must(QueryBuilders.rangeQuery("{{lowerCase field.name}}").lt({{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "LTANDEQ"}}
            this.getEsCond().must(QueryBuilders.rangeQuery("{{lowerCase field.name}}").lte({{camelCase field.codeName}}{{formitem.valueOP}}));
                    {{/eq}}
                    {{#eq formitem.valueOP "ISNOTNULL"}}
			if(this.{{camelCase field.codeName}}{{formitem.valueOP}}.equals("1")){
				this.getEsCond().mustNot(QueryBuilders.existsQuery("{{lowerCase field.name}}"));
			}
                    {{/eq}}
                    {{#eq formitem.valueOP "ISNULL"}}
			if(this.{{camelCase field.codeName}}{{formitem.valueOP}}.equals("1")){
				this.getEsCond().must(QueryBuilders.existsQuery("{{lowerCase field.name}}"));
			}
                    {{/eq}}
            {{/if}}
        }
        return this;
    } 
            {{/each}}
    {{/each}}

    /**
	 * 启用快速搜索
	 */
	public void setQuery(String query)
	{
		this.query=query;
		if(!StringUtils.isEmpty(query)){
    {{#each entity.quickSearchFields as |field|}} 
            {{#if @first}}
            this.getSearchCond().and( wrapper ->
                     wrapper.like("{{lowerCase field.name}}", query)
            {{else}}
                        .or().like("{{lowerCase field.name}}", query)
            {{/if}}
            {{#if @last}}
            );
            {{/if}} 
    {{/each}}
		}
	}
}