package com.ruoyi.ems.domain;

import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.List;
import java.util.Map;

/**
 * 报表查询配置对象
 * 用于前端传参和模板配置解析
 *
 * @author ruoyi
 * @date 2026-01-30
 */
@Data
@ApiModel("报表查询配置")
public class ReportQueryConfig {
    private static final long serialVersionUID = 1L;

    /** 数据源编码 */
    @ApiModelProperty("数据源编码")
    private String dsCode;

    /** 模板编码(可选,如果指定则使用模板配置) */
    @ApiModelProperty("模板编码")
    private String templateCode;

    /** 选中的字段列表 */
    @ApiModelProperty("选中的字段列表")
    private List<String> selectedFields;

    /** 查询条件列表 */
    @ApiModelProperty("查询条件列表")
    private List<QueryCondition> conditions;

    /** 分组字段列表 */
    @ApiModelProperty("分组字段列表")
    private List<String> groupBy;

    /** 排序配置列表 */
    @ApiModelProperty("排序配置列表")
    private List<OrderByConfig> orderBy;

    /** 聚合字段配置 */
    @ApiModelProperty("聚合字段配置 fieldCode -> 聚合函数(SUM/AVG/MAX/MIN/COUNT)")
    private Map<String, String> aggregateFields;

    /** 是否去重 */
    @ApiModelProperty("是否去重")
    private Boolean distinct;

    /** 分页-页码 */
    @ApiModelProperty("页码")
    private Integer pageNum;

    /** 分页-每页数量 */
    @ApiModelProperty("每页数量")
    private Integer pageSize;

    /** 是否导出全部(不分页) */
    @ApiModelProperty("是否导出全部")
    private Boolean exportAll;

    /** 条件参数值(用于模板变量替换) */
    @ApiModelProperty("条件参数值")
    private Map<String, Object> params;

    /**
     * 查询条件
     */
    @Data
    @ApiModel("查询条件")
    public static class QueryCondition {
        /** 字段编码 */
        @ApiModelProperty("字段编码")
        private String field;

        /** 操作符 */
        @ApiModelProperty("操作符(eq/ne/gt/gte/lt/lte/like/in/between/isNull/isNotNull)")
        private String operator;

        /** 值(单值条件) */
        @ApiModelProperty("值")
        private Object value;

        /** 第二个值(between条件) */
        @ApiModelProperty("第二个值(between条件)")
        private Object value2;

        /** 是否可选(为空时跳过) */
        @ApiModelProperty("是否可选")
        private Boolean optional;

        /** 逻辑关系(与下一个条件的关系) */
        @ApiModelProperty("逻辑关系(AND/OR)")
        private String logic;
    }

    /**
     * 排序配置
     */
    @Data
    @ApiModel("排序配置")
    public static class OrderByConfig {
        /** 字段编码 */
        @ApiModelProperty("字段编码")
        private String field;

        /** 排序方向 */
        @ApiModelProperty("排序方向(ASC/DESC)")
        private String direction;
    }

    /**
     * 初始化默认值
     */
    public void initDefaults() {
        if (this.pageNum == null || this.pageNum < 1) {
            this.pageNum = 1;
        }
        if (this.pageSize == null || this.pageSize < 1) {
            this.pageSize = 20;
        }
        if (this.pageSize > 10000) {
            this.pageSize = 10000;
        }
        if (this.distinct == null) {
            this.distinct = false;
        }
        if (this.exportAll == null) {
            this.exportAll = false;
        }
    }
}