package com.docus.server.entity;

import com.baomidou.mybatisplus.annotation.TableField;
import com.docus.server.enums.StateEnum;
import com.docus.server.util.DateSpiltUtil;
import com.docus.server.util.PeriodTime;
import com.fasterxml.jackson.annotation.JsonFormat;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;

import java.util.Date;
import java.util.List;

/**
 * 收集数据任务配置
 */
@ApiModel(value = "TaskConfig对象", description = "")
@Data
@JsonIgnoreProperties(value = {"incPeriodTimes", "allPeriodTimes", "offset", "pageNum"})
public class TaskConfig {
    @ApiModelProperty(value = "主键")
    private Long id;

    /**
     * 任务名字
     */
    @ApiModelProperty(value = "任务名字")
    @TableField("name")
    private String name;
    /**
     * 任务重试键
     */
    @ApiModelProperty(value = "任务重试键")
    @TableField("retry_key")
    private String retryKey;
    /**
     * 任务类型。 dept，user....
     */
    @ApiModelProperty(value = "任务类型")
    private String type;

    @ApiModelProperty(value = "任务描述")
    private String memo;
    /**
     * 数据起始时间范围
     */
    @ApiModelProperty(value = "数据起始时间范围")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date startTime;

    /**
     * 数据结束时间范围
     */
    @ApiModelProperty(value = "数据结束时间范围")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date endTime;


    /**
     * 指针时间，当前全量任务的任务执行到的时间
     */
    @ApiModelProperty(value = "指针时间，当前全量任务的任务执行到的时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date allPointerTime;
    /**
     * 偏移量
     */
    @TableField(exist = false)
    private int offset;
    /**
     * 页码
     */
    @TableField(exist = false)
    private int pageNum;
    /**
     * 每页大小
     */
    @ApiModelProperty(value = "每页大小")
    private int pageSize;

    /**
     * 时间分割周期，把起始时间结束时间进行分割，单位为秒
     */
    @ApiModelProperty(value = "时间分割周期，把起始时间结束时间进行分割，单位为秒")
    private Long spiltPeriod;

    /**
     * 指针时间，当前增量任务的执行到的时间
     */
    @ApiModelProperty(value = "指针时间，当前增量任务的执行到的时间")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date incPointerTime;
    /**
     * 任务其他参数配置
     */
    @ApiModelProperty(value = "任务其他参数配置")
    private String param;
    /**
     * 执行状态
     */
    @ApiModelProperty(value = "执行状态")
    private StateEnum state = StateEnum.OK;

    /**
     * 上回失败信息
     */
    @ApiModelProperty(value = "上回失败信息")
    private String lastErrorMsg;

    @ApiModelProperty(value = "创建时间")
    @TableField("create_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date createTime;

    @ApiModelProperty(value = "更新时间")
    @TableField("update_time")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private Date updateTime;

    @ApiModelProperty(value = "是否有重试详情日志")
    @TableField(exist = false)
    private boolean haveRetryLog;

    public List<PeriodTime> getAllPeriodTimes() {
        List<PeriodTime> periodTimes = DateSpiltUtil.spiltDate(this.getStartTime(), this.endTime, 1000 * spiltPeriod);
        return periodTimes;
    }


    public List<PeriodTime> getIncPeriodTimes() {
        List<PeriodTime> periodTimes = DateSpiltUtil.spiltDate(incPointerTime, new Date(), 1000 * spiltPeriod);
        return periodTimes;
    }


    /**
     * 重写启动时间，如果当前时间有，则取当前时间
     *
     * @return 启动时间
     */
    public Date getStartTime() {
        if (allPointerTime != null) {
            return allPointerTime;
        }
        return this.startTime;
    }
}
