package com.tashow.cloud.systemapi.api.dict;

import static com.tashow.cloud.common.util.collection.CollectionUtils.convertList;

import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import com.tashow.cloud.common.pojo.CommonResult;
import com.tashow.cloud.systemapi.api.dict.dto.DictDataRespDTO;
import com.tashow.cloud.systemapi.enums.ApiConstants;
import java.util.Collection;
import java.util.List;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;

@FeignClient(name = ApiConstants.NAME) // TODO 芋艿：fallbackFactory =
/** RPC 服务 - 字典数据 */
public interface DictDataApi {

  String PREFIX = ApiConstants.PREFIX + "/dict-data";

  @GetMapping(PREFIX + "/valid")
  /** 校验字典数据们是否有效 */
  CommonResult<Boolean> validateDictDataList(
      @RequestParam("dictType") String dictType, @RequestParam("values") Collection<String> values);

  @GetMapping(PREFIX + "/get")
  /** 获得指定的字典数据 */
  CommonResult<DictDataRespDTO> getDictData(
      @RequestParam("dictType") String dictType, @RequestParam("value") String value);

  /**
   * 获得指定的字典标签，从缓存中
   *
   * @param type 字典类型
   * @param value 字典数据值
   * @return 字典标签
   */
  default String getDictDataLabel(String type, Integer value) {
    DictDataRespDTO dictData = getDictData(type, String.valueOf(value)).getData();
    if (ObjUtil.isNull(dictData)) {
      return StrUtil.EMPTY;
    }
    return dictData.getLabel();
  }

  @GetMapping(PREFIX + "/parse")
  /** 解析获得指定的字典数据 */
  CommonResult<DictDataRespDTO> parseDictData(
      @RequestParam("dictType") String dictType, @RequestParam("label") String label);

  @GetMapping(PREFIX + "/list")
  /** 获得指定字典类型的字典数据列表 */
  CommonResult<List<DictDataRespDTO>> getDictDataList(@RequestParam("dictType") String dictType);

  /**
   * 获得字典数据标签列表
   *
   * @param dictType 字典类型
   * @return 字典数据标签列表
   */
  default List<String> getDictDataLabelList(String dictType) {
    List<DictDataRespDTO> list = getDictDataList(dictType).getData();
    return convertList(list, DictDataRespDTO::getLabel);
  }
}
