package com.bonus.system.api;

import com.bonus.common.core.constant.SecurityConstants;
import com.bonus.common.core.constant.ServiceNameConstants;
import com.bonus.common.core.web.domain.AjaxResult;
import com.bonus.common.core.web.page.TableDataInfo;
import com.bonus.system.api.domain.SysDictType;
import com.bonus.system.api.factory.RemoteDictTypeFallbackFactory;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;


/**
 * @author wangvivi
 */
@FeignClient(contextId = "remoteDictTypeService", value = ServiceNameConstants.SYSTEM_SERVICE, fallbackFactory = RemoteDictTypeFallbackFactory.class)
public interface RemoteDictTypeService {

    /**
     * 根据字典标签或字典类型或状态查询字典数据列表
     * @param dictType 字典类型的查询条件，如字典名称，字典类型或状态（启用或停用），创建时间范围
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 满足条件的字典类型列表分页信息
     */
    @GetMapping("/dict/type/list")
    public TableDataInfo list(SysDictType dictType, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 根据字典类型id 查询字典类型详细
     * @param dictId 字典类型id
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 字典类型详细
     */
    @GetMapping(value = "/dict/type/{dictId}")
    public AjaxResult getInfo(@PathVariable("dictId") Long dictId, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 新增字典类型
     * @param dict 新增的字典类型
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 新增成功影响的行数或错误码和错误消息
     */
    @PostMapping(value = "/dict/type")
    public AjaxResult add(@Validated @RequestBody SysDictType dict, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 修改字典类型
     * @param dict 修改的字典类型
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 修改成功影响的行数或错误码和错误消息
     */
   @PostMapping(value = "/dict/type/edit")
    public AjaxResult edit(@Validated @RequestBody SysDictType dict, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 删除字典类型
     * @param dictIds 字段类型id列表
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 成功或出错信息
     */
    @PostMapping("/dict/type/delete/{dictIds}")
    public AjaxResult remove(@PathVariable("dictIds") Long[] dictIds, @RequestHeader(SecurityConstants.FROM_SOURCE) String source);

    /**
     * 获取所有字典类型
     * @param source 请求来源，使用SecurityConstants.INNER
     * @return 成功或出错信息
     */
    @GetMapping("/dict/type/optionselect")
    public AjaxResult optionselect(@RequestHeader(SecurityConstants.FROM_SOURCE) String source);
}
