package com.fs.audit.chain.handler;

import cn.hutool.core.util.ObjectUtil;
import com.fs.audit.chain.AbstractAuditHandler;
import com.fs.audit.chain.AuditContext;
import com.fs.audit.chain.AuditResult;
import com.fs.audit.enums.AuditStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

/**
 * 状态校验处理器
 * 校验审核实例和当前步骤的状态是否允许审核
 */
@Slf4j
@Component
@Order(2)
public class StatusValidateHandler extends AbstractAuditHandler {

    @Override
    protected AuditResult doHandle(AuditContext context) {
        log.info("执行状态校验处理器");

        // 如果公司为空，需要
        if(ObjectUtil.isNull(context.getCompanyId())){
            if(ObjectUtil.notEqual(context.getUserType(),1)){
                throw new IllegalArgumentException("非系统用户，公司ID不能为空!");
            }
        }

        // 校验审核实例状态
        Integer auditStatus = context.getAudit().getStatus();
        if (!AuditStatus.PENDING.getCode().equals(auditStatus)) {
            String statusDesc = AuditStatus.fromCode(auditStatus).getDesc();
            log.warn("审核实例状态不允许审核，当前状态: {}", statusDesc);
            return AuditResult.fail("该审核已结束，状态: " + statusDesc);
        }

        // 校验当前步骤状态
        Integer flowStatus = context.getCurrentFlow().getStatus();
        if (!AuditStatus.PENDING.getCode().equals(flowStatus)) {
            log.warn("当前步骤状态不允许审核，状态: {}", flowStatus);
            return AuditResult.fail("当前步骤已被审核");
        }

        log.info("状态校验通过");
        return AuditResult.success("状态校验通过");
    }

    @Override
    public int getOrder() {
        return 2;
    }
}

