package cn.axzo.msg.center.service.pending.request;

import cn.axzo.basics.common.page.PageRequest;
import cn.axzo.msg.center.service.dto.QueryOrderByDTO;
import cn.axzo.msg.center.service.enums.AppTerminalTypeEnum;
import cn.axzo.msg.center.service.enums.BizFinalStateEnum;
import cn.axzo.msg.center.service.enums.IdentityTypeEnum;
import cn.axzo.msg.center.service.enums.PendingMessageRoleCategoryEnum;
import cn.axzo.msg.center.service.enums.PendingMessageStateEnum;
import cn.axzo.msg.center.service.enums.TerminalTypeEnum;
import cn.axzo.msg.center.service.enums.TodoQueryType;
import cn.axzo.msg.center.service.enums.TodoType;
import cn.axzo.msg.center.service.enums.YesOrNo;
import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
import org.apache.commons.collections4.CollectionUtils;
import org.apache.commons.lang3.StringUtils;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.util.Collection;
import java.util.Collections;

/**
 * @description
 *   代办记录分页查询参数的数模型
 * @author cold_blade
 * @date 2023/9/23
 * @version 1.0
 */
@Setter
@Getter
public class PendingMessagePageRequest extends PageRequest implements Serializable {

    private static final long serialVersionUID = 7172093131252325437L;

    /**
     * APP终端类型(前端不care)
     *   WEB: web端页面
     *   MINI_PROGRAM: 安心筑小程序端页面
     *   IOS: 原生IOS端页面
     *   ANDROID: 原生Android端页面
     *   WEB_VIEW: H5页面
     *   WECHAT_MINI_PROGRAM: 微信小程序页面
     */
    private TerminalTypeEnum terminalType;
    /**
     * 应用终端
     */
    private AppTerminalTypeEnum appTerminalType;
    /**
     * 当前登录账户的自然id(前端不care)
     */
    @NotNull(message = "personId is required")
    private Long personId;
    /**
     * 当前登录账户的身份id(前端不care)
     */
    private Long identityId;
    /**
     * 当前登录账户的身份类型(前端不care)
     */
    private IdentityTypeEnum identityType;
    /**
     * 业务方是否只关注特定身份的消息
     *   true: 是
     *   false: 否
     */
    private Boolean withIdentify;
    /**
     * 代办角色
     *   PROMOTER: 发起者
     *   EXECUTOR: 执行者
     */
    private PendingMessageRoleCategoryEnum roleCategory;
    /**
     * 代办消息状态
     *   UNSENT: 未发送
     *   HAS_BEEN_SENT: 已发送
     *   COMPLETED: 已办
     *   RETRACT: 已撤回
     *   DELETED: 已删除
     */
    private PendingMessageStateEnum msgState;
    /**
     * COMPLETED: 已处理
     * RETRACT: 已撤销
     * PASSED: 已通过
     * REJECTED: 已拒绝
     */
    private BizFinalStateEnum bizFinalState;
    /**
     * 代办消息的分类结点编码, 单个节点. groupNodeCodes的优先级高于groupNodeCode
     */
    private String groupNodeCode;
    /**
     * 代办消息的分类结点编码, 支持多个节点. groupNodeCodes的优先级高于groupNodeCode
     */
    private Collection<String> groupNodeCodes;
    /**
     * 消息标题
     */
    private String title;
    /**
     * 工作台id
     */
    private Long workspaceId;
    /**
     * 单位id
     */
    private Long ouId;
    /**
     * 排序字段集合
     */
    private Collection<QueryOrderByDTO> orderFields;

    /**
     * 待办类型. 我发起，待处理, 已处理可不传
     *  EXECUTABLE: 可执行的.
     *  COPIED_TO_ME: 抄送给我的
     */
    private TodoType todoType;

    /**
     * 查询只读待办(抄送)的相关参数
     */
    private CopiedToMeParam copiedToMeParam;

    /**
     * 查询类型
     *  HAS_BEEN_SENT: 待处理
     *  COMPLETED: 已处理
     *  SEND_BY_ME: 我发起
     *  COPIED_TO_ME: 抄送我
     */
    private TodoQueryType queryType;

    /**
     * 是否支持批量处理
     */
    private YesOrNo supportBatchProcess;

    /**
     * 是否返回待办模版对应的终端列表
     */
    private Boolean queryTemplateTerminals;

    // !! 用于排查问题
    private String analysisToken;
    private AnalysisInfo a = new AnalysisInfo();

    public boolean determineQueryTemplateTerminals() {
        return queryTemplateTerminals != null && queryTemplateTerminals;
    }

    public PendingMessageRoleCategoryEnum determineRoleCategory() {
        return roleCategory != null ? roleCategory : PendingMessageRoleCategoryEnum.EXECUTOR;
    }

    @NotNull
    public Collection<String> determineGroupNodeCodes() {
        if (CollectionUtils.isNotEmpty(groupNodeCodes))
            return groupNodeCodes;
        if (StringUtils.isNotBlank(groupNodeCode))
            return Collections.singletonList(groupNodeCode);
        return Collections.emptyList();
    }

    /**
     * 查询只读待办(抄送)的相关参数
     */
    @Data
    public static class CopiedToMeParam {
        /**
         * 是否只查询未读的
         */
        private Boolean queryUnreadOnly;

        public boolean determineQueryUnreadOnly() {
            return queryUnreadOnly != null && queryUnreadOnly;
        }
    }

    public boolean useCustomSort() {
        return CollectionUtils.isNotEmpty(orderFields);
    }

    public boolean isQueryBusiness() {
        return determineToDoType() == TodoType.EXECUTABLE
                && getRoleCategory() == PendingMessageRoleCategoryEnum.PROMOTER;
    }

    public TodoType determineToDoType() {
        return todoType == null ? TodoType.EXECUTABLE : todoType;
    }

    @Override
    public String toString() {
        return JSON.toJSONString(this);
    }
}
