package cn.axzo.msg.center.api;

import cn.axzo.core.domain.PageResult;
import cn.axzo.msg.center.api.fallback.InsideMessageRecordApiFallBack;
import cn.axzo.msg.center.api.request.*;
import cn.axzo.msg.center.api.response.MessageNewRes;
import cn.axzo.msg.center.api.response.MessageRecordRes;
import cn.azxo.framework.common.model.CommonResponse;
import com.baomidou.mybatisplus.core.metadata.IPage;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import javax.validation.Valid;
import java.util.List;

@FeignClient(name = "msg-center", url = "${server.serviceUrl:http://msg-center:8080}", fallback = InsideMessageRecordApiFallBack.class)
@Component
public interface InsideMessageRecordApi {

    /**
     *  消息列表
     * @param req
     * @return
     */
    @PostMapping("webApi/wx/message/list")
    CommonResponse<PageResult<MessageNewRes>> listMsgInfo4Trade(CmsMsgListReq req);

    /**
     *  查询消息记录
     * @param request
     * @return
     */
    @PostMapping("msg/record/list")
    CommonResponse<PageResult<MessageRecordRes>> queryMessageRecordList(@RequestBody MessageRecordReq request);

    /**
     * 修改成已读
     * @param request
     * @return
     */
    @PostMapping("msg/record/change/read")
    CommonResponse<Boolean> changeHasRead(@RequestBody @Valid UpdateReadReq request);

    /**
     *  查询未读消息列表
     * @param request
     * @return
     */
    @PostMapping("msg/record/unread/list")
    CommonResponse<PageResult<MessageRecordRes>> queryUnReadList(@RequestBody QueryMessageRecordReq request);

    /**
     *  查询已发送列表
     * @param request
     * @return
     */
    @PostMapping("msg/record/sent/list")
    CommonResponse<PageResult<MessageRecordRes>> querySent(@RequestBody QueryMessageRecordReq request);

    /**
     * 统计未读数量
     * @param request
     * @return
     */
    @PostMapping("msg/record/unread/statistics")
    CommonResponse<Integer> unReadStatistics(@RequestBody MessageStatisticsReq request);

    /**
     * 批量删除消息记录，支持以下两种方式
     *   1. 传入待删除的消息记录id列表
     *   2. 传入消息模块与模板关联关系的id
     * 两个属性必须有一个有效，否则服务端将不进行任何处理
     * 注意：
     *   1. 为了防止由于一次行传入超大量的消息记录的id导致MySql所加的行锁过多，服务端会对传入的消息记录的id列表限制，最好不要超过500
     *   2. 通过relationId的方式删除，服务端在做删除的时候无法预知具体的行数，因此要甚用该参数
     * @param request 消息记录的id列表 OR 消息模块与模板的关联关系id
     * @return 成功删除返回 {@code true}，否则返回 {@code false}
     */
    @PostMapping("msg/record/delete")
    CommonResponse<Boolean> deleteMessageRecords(@RequestBody MessageRecordDeleteReq request);

    /**
     *  标记为已经接收
     * @param msgIdList
     * @return
     */
    @PostMapping("msg/record/markReceived")
    CommonResponse<Void> markReceived(@RequestBody List<Long> msgIdList);
}
