package com.njcn.rdms.module.system.api.notify;

import com.njcn.rdms.framework.common.pojo.CommonResult;
import com.njcn.rdms.module.system.api.notify.dto.NotifySingleSendReqDTO;
import com.njcn.rdms.module.system.api.notify.dto.NotifyUnreadMessageListReqDTO;
import com.njcn.rdms.module.system.api.notify.dto.NotifyUnreadMessageRespDTO;
import com.njcn.rdms.module.system.enums.ApiConstants;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;
import java.util.Map;

/**
 * 站内信发送 API（跨模块统一入口契约）。
 *
 * <p>业务方（如 project）经此发送站内信，不依赖 system-boot 内部发送实现。
 * userType 在能力层固定 ADMIN，不暴露给业务方。</p>
 *
 * @author hongawen
 */
@FeignClient(name = ApiConstants.NAME)
@Tag(name = "RPC 服务 - 站内信发送") // 对 NotifySendService 的封装，供其它模块统一入口调用
public interface NotifyMessageSendApi {

    String PREFIX = ApiConstants.PREFIX + "/notify-message-send";

    @PostMapping(PREFIX + "/send-single")
    @Operation(summary = "发送单条站内信")
    CommonResult<Long> sendSingleNotify(@Valid @RequestBody NotifySingleSendReqDTO reqDTO);

    /**
     * 便捷方法：发送单条站内信给管理后台用户（userType 固定 ADMIN，由实现层处理）。
     *
     * @param userId 接收用户编号
     * @param templateCode 模板编码（场景标识，发送前模板必须已配置）
     * @param templateParams 模板参数
     */
    default void sendSingleNotifyToAdmin(Long userId, String templateCode, Map<String, Object> templateParams) {
        sendSingleNotify(new NotifySingleSendReqDTO().setUserId(userId)
                .setTemplateCode(templateCode).setTemplateParams(templateParams)).checkError();
    }

    /**
     * 便捷方法：发送带等级的单条站内信给管理后台用户。
     *
     * @param level 消息等级，见 {@link com.njcn.rdms.module.system.enums.notify.NotifyMessageLevelConstants}
     */
    default void sendSingleNotifyToAdmin(Long userId, String templateCode,
                                         Map<String, Object> templateParams, Integer level) {
        sendSingleNotify(new NotifySingleSendReqDTO().setUserId(userId)
                .setTemplateCode(templateCode).setTemplateParams(templateParams).setLevel(level)).checkError();
    }

    /**
     * 查询一批用户在指定模板下的未读站内信（userType 固定 ADMIN，由实现层处理）。
     *
     * <p>供业务方做"未读不重发"类判定（如临期/逾期告警）；
     * 与发送同挂在本 API：复用既有 Feign 注册，消息域的跨模块入口保持唯一。</p>
     */
    @PostMapping(PREFIX + "/unread-list-by-template-codes")
    @Operation(summary = "查询一批用户在指定模板下的未读站内信")
    CommonResult<List<NotifyUnreadMessageRespDTO>> getUnreadNotifyMessageListByTemplateCodes(
            @Valid @RequestBody NotifyUnreadMessageListReqDTO reqDTO);

}
