package tech.easyflow.skill.mapper;

import com.mybatisflex.core.BaseMapper;
import org.apache.ibatis.annotations.Param;
import org.apache.ibatis.annotations.Delete;
import org.apache.ibatis.annotations.Update;
import tech.easyflow.skill.entity.SkillImportStage;

import java.math.BigInteger;
import java.util.Date;

/**
 * Skill 导入临时包 Mapper。
 */
public interface SkillImportStageMapper extends BaseMapper<SkillImportStage> {

    /**
     * 原子消费仍有效的导入令牌。
     *
     * @param token 导入令牌
     * @param tenantId 租户 ID
     * @param accountId 用户 ID
     * @param now 当前时间
     * @return 更新行数
     */
    @Update("UPDATE tb_skill_import_stage SET status='PROCESSING', expires_at=#{processingExpiresAt} "
            + "WHERE import_token=#{token} AND tenant_id=#{tenantId} AND account_id=#{accountId} "
            + "AND status='PENDING' AND expires_at>#{now}")
    int consume(@Param("token") String token,
                @Param("tenantId") BigInteger tenantId,
                @Param("accountId") BigInteger accountId,
                @Param("now") Date now,
                @Param("processingExpiresAt") Date processingExpiresAt);

    /**
     * 将待确认令牌原子转为已过期的处理中状态，阻止删除文件期间被并发消费。
     *
     * @param token 导入令牌
     * @param tenantId 租户 ID
     * @param accountId 用户 ID
     * @param now 当前时间，同时作为立即清理截止时间
     * @return 更新行数
     */
    @Update("UPDATE tb_skill_import_stage SET status='PROCESSING', expires_at=#{now} "
            + "WHERE import_token=#{token} AND tenant_id=#{tenantId} AND account_id=#{accountId} "
            + "AND status='PENDING'")
    int beginCancel(@Param("token") String token,
                    @Param("tenantId") BigInteger tenantId,
                    @Param("accountId") BigInteger accountId,
                    @Param("now") Date now);

    /**
     * 删除已原子进入取消流程且属于当前用户的令牌。
     *
     * @param token 导入令牌
     * @param tenantId 租户 ID
     * @param accountId 用户 ID
     * @return 删除行数
     */
    @Delete("DELETE FROM tb_skill_import_stage WHERE import_token=#{token} AND tenant_id=#{tenantId} "
            + "AND account_id=#{accountId} AND status='PROCESSING'")
    int finishCancel(@Param("token") String token,
                     @Param("tenantId") BigInteger tenantId,
                     @Param("accountId") BigInteger accountId);
}
