package cn.pluss.platform.entity;

import com.alibaba.fastjson.JSONObject;
import com.baomidou.mybatisplus.annotation.FieldFill;
import com.baomidou.mybatisplus.annotation.TableField;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import java.util.Objects;

/**
 * <p>
 *  任务配置数据，循环任务执行具体时间取决于定时任务触发时间
 * </p>
 *
 * @author Djh
 * @since 2022-05-27
 */
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
@TableName("tb_pluss_user_task")
public class UserTask implements Serializable {

    private static final long serialVersionUID = 1L;

    /**
     * 生效中
     */
    public static final String STATUS_ENABLED = "1";

    /**
     * 已取消
     */
    public static final String STATUS_CANCELED = "2";

    /**
     * 已过期
     */
    public static final String STATUS_EXPIRED = "3";

    /** 只执行一次 */
    public static final String TYPE_ONCE = "1";

    /** 每天执行一次 */
    public static final String TYPE_DAY = "2";

    /** 每周执行一次 */
    public static final String TYPE_WEEK = "3";

    /** 每月执行一次 */
    public static final String TYPE_MONTH = "4";

    /**
     * id
     */
    @TableId("id")
    private Integer id;


    /**
     * 用户id
     */
    @TableField("userId")
    private Integer userId;


    /**
     * 任务编码
     */
    @TableField("taskCode")
    private String taskCode;


    /**
     * 任务编码类型
     */
    @TableField(exist = false)
    private String taskCodeDesc;


    /**
     * 状态，1：生效中；2：已取消；3：已过期
     */
    @TableField("status")
    private String status;


    @TableField(exist = false)
    private String statusDesc;


    /**
     * 任务类型，1：第二天执行一次；2：每天执行一次；3：每周一次；4：每月执行一次
     */
    @TableField("type")
    private String type;

    @TableField(exist = false)
    private String typeDesc;

    /**
     * 参数一， 具体参数使用规则根据任务逻辑来定
     */
    @TableField("arg0")
    private String arg0;


    /**
     * 参数二
     */
    @TableField("arg1")
    private String arg1;


    /**
     * 参数二
     */
    @TableField("arg2")
    private String arg2;


    /**
     * 参数二
     */
    @TableField("arg3")
    private String arg3;


    /**
     * 参数过多直接存json
     */
    private JSONObject extension;


    /**
     * 创建时间
     */
    @TableField(value = "createTime", fill = FieldFill.INSERT)
    private Date createTime;

    /**
     * 创建时间 开始时间
     */
    @TableField(exist = false, condition = "createTime &gt; #{%s}")
    private Date createTimeStart;

    /**
     * 创建时间 截止时间
     */
    @TableField(exist = false, condition = "createTime &lt; #{%s}")
    private Date createTimeEnd;

    /**
     * 更新时间
     */
    @TableField(value = "updateTime", fill = FieldFill.INSERT_UPDATE)
    private Date updateTime;

    /**
     * 更新时间 开始时间
     */
    @TableField(exist = false, condition = "updateTime &gt; #{%s}")
    private Date updateTimeStart;

    /**
     * 更新时间 截止时间
     */
    @TableField(exist = false, condition = "updateTime &lt; #{%s}")
    private Date updateTimeEnd;


    public static void wrapper(UserTask src, List<TaskSort> taskSortList) {
        if (src == null) {
            return;
        }

        switch (src.getType()) {
            case "1":
                src.setTypeDesc("第二天执行一次");
                break;
            case "2":
                src.setTypeDesc("每日一次");
                break;
            case "3":
                src.setTypeDesc("每周一次");
                break;
            case "4":
                src.setTypeDesc("每月一次");
                break;
            default:
                src.setTypeDesc("未知类型");
                break;
        }

        switch (src.getStatus()) {
            case "1":
                src.setStatusDesc("生效中");
                break;
            case "2":
                src.setStatusDesc("已取消");
                break;
            case "3":
                src.setStatusDesc("已过期");
                break;
            default:
                break;
        }

        if (taskSortList == null || taskSortList.isEmpty()) {
            return;
        }

        for (TaskSort taskSort : taskSortList) {
            if (Objects.equals(taskSort.getCode(), src.getTaskCode())) {
                src.setTaskCodeDesc(taskSort.getCode());
                return;
            }
        }
    }
}