package cn.axzo.msg.center.service.template.client;

import cn.axzo.msg.center.service.template.request.MessageTemplateCreateRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplatePageRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateSyncDto;
import cn.axzo.msg.center.service.template.request.MessageTemplateSyncQueryRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateRequest;
import cn.axzo.msg.center.service.template.request.MessageTemplateUpdateStatusRequest;
import cn.axzo.msg.center.service.template.response.MessageDetailStyle;
import cn.axzo.msg.center.service.template.response.MessageTemplateDetailResponse;
import cn.axzo.msg.center.service.template.response.MessageTemplatePageResponse;
import cn.azxo.framework.common.model.CommonResponse;
import cn.azxo.framework.common.model.Page;
import java.util.Collection;
import java.util.List;
import javax.validation.Valid;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestParam;

/**
 * 消息模板管理
 */
@Component
@FeignClient(value = "msg-center", url = "${server.serviceUrl:http://msg-center:8080}")
public interface MessageTemplateClient {

    /**
     * 添加消息模板
     *
     * @param request 模板数据模型
     * @return 模板编码
     */
    @PostMapping(value = "/message/template/add", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<String> save(@RequestBody @Valid MessageTemplateCreateRequest request);

    /**
     * 编辑消息模板
     *
     * @param request 模板数据模型
     */
    @PostMapping(value = "/message/template/update", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<Void> update(@RequestBody @Valid MessageTemplateUpdateRequest request);

    /**
     * 消息模板详情
     *
     * @param templateCode 消息模板编码
     * @return 消息模板详情
     */
    @PostMapping(value = "/message/template/detail", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<MessageTemplateDetailResponse> detail(@RequestParam("templateCode") String templateCode);

    /**
     * 分页查询模板
     *
     * @param request 分页查询参数
     * @return 模板列表
     */
    @PostMapping(value = "/message/template/page", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<Page<MessageTemplatePageResponse>> page(@RequestBody MessageTemplatePageRequest request);

    /**
     * 通过模板编码查询对应的模板
     *
     * @param templateCodes  模板编码集合
     * @return 模板列表
     */
    @PostMapping(value = "/message/template/list", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<List<MessageTemplatePageResponse>> listByCodes(@RequestParam("templateCodes") Collection<String> templateCodes);

    /**
     * 启用/禁用消息模板
     *
     * @param request 模板状态
     */
    @PostMapping(value = "/message/template/update-status", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<Void> updateStatus(@RequestBody @Valid MessageTemplateUpdateStatusRequest request);

    /**
     * 查询消息模板
     */
    @PostMapping(value = "/message/template/sync/get", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<MessageTemplateSyncDto> getSyncMessageTemplate(@RequestBody @Valid MessageTemplateSyncQueryRequest request);

    /**
     * 同步消息模板
     * req-1896 说明：仅pre环境能同步
     */
    @PostMapping(value = "/message/template/sync", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<Void> syncTemplate(@RequestBody @Valid MessageTemplateSyncDto request);

    /**
     * 获取所有消息样式
     */
    @GetMapping(value = "/message/template/list-template-detail-styles", produces = {MediaType.APPLICATION_JSON_VALUE})
    CommonResponse<List<MessageDetailStyle>> listTemplateDetailStyles();
}
