package com.fs.store.mapper;

import com.fs.store.domain.FsMiniprogramSubNotifyTask;
import org.apache.ibatis.annotations.*;
import com.alibaba.fastjson.JSONObject;
import java.time.LocalDateTime;
import java.util.List;

/**
 * FsMiniprogramSubNotifyTaskMapper接口，用于定义微信小程序子通知任务的数据访问方法。
 *
 * @author xdd
 * @version 1.0.0
 * @since 2025-03-10
 */
@Mapper
public interface FsMiniprogramSubNotifyTaskMapper {

    /**
     * 根据ID查询任务
     * @param id 任务ID
     * @return 任务实体
     */
    @Select("SELECT * FROM fs_miniprogram_sub_notify_task WHERE id = #{id}")
    FsMiniprogramSubNotifyTask findById(Long id);

    /**
     * 插入新任务
     * @param task 任务实体
     * @return
     */
    @Insert("INSERT INTO fs_miniprogram_sub_notify_task (task_name, template_id, touser, page, `data`, status, " +
            "retry_count, max_retries, request_params,request_body, response_body, error_message, create_time, update_time) " +
            "VALUES (#{taskName}, #{templateId}, #{touser}, #{page}, #{data}, #{status}, #{retryCount}, " +
            "#{maxRetries}, #{requestParams},#{requestBody}, #{responseBody}, #{errorMessage}, #{createTime}, #{updateTime})")
    @Options(useGeneratedKeys = true, keyProperty = "id")
    int insert(FsMiniprogramSubNotifyTask task);
    /**
     * 更新任务状态
     *
     * @param id     任务ID
     * @param status 任务状态
     * @param retryCount     重试次数
     * @param responseBody     响应体
     * @param errorMessage      错误信息
     * @param updateTime     更新时间
     * @return 受影响的行数
     */
    @Update("<script>" +
            "UPDATE fs_miniprogram_sub_notify_task " +
            "SET update_time = #{updateTime} " +
            "<if test='status != null'>, status = #{status}</if>" +
            "<if test='retryCount != null'>, retry_count = #{retryCount}</if>" +
            "<if test='responseBody != null'>, response_body = #{responseBody}</if>" +
            "<if test='errorMessage != null'>, error_message = #{errorMessage}</if>" +
            "WHERE id = #{id}" +
            "</script>")
    int updateStatus(@Param("id") Long id, @Param("status") Integer status,
                     @Param("retryCount") Integer retryCount,
                     @Param("responseBody") String responseBody, @Param("errorMessage")String errorMessage,
                     @Param("updateTime") LocalDateTime updateTime);

    /**
     * 查询所有待处理数据
     * @return
     */
    @Select("SELECT * FROM fs_miniprogram_sub_notify_task WHERE retry_count<3 and status in (0,3)")
    List<FsMiniprogramSubNotifyTask> selectPendingData();

    /**
     * 批量更新数据
     * @param pendingData 更新的数据
     */
    void updateBatchById(@Param("list") List<FsMiniprogramSubNotifyTask> pendingData);

    /**
     * 批量插入数据
     * @param subNotifyTasks 数据
     */
    void insertBatch(List<FsMiniprogramSubNotifyTask> subNotifyTasks);
}
