package com.red.circle.other.infra.database.cache.service.user.impl;


import com.red.circle.common.business.core.EnumConfigCache;
import com.red.circle.common.business.core.SysConfigEnum;
import com.red.circle.framework.mybatis.constant.PageConstant;
import com.red.circle.other.infra.convertor.user.EnumConfigConvertor;
import com.red.circle.other.infra.database.cache.service.other.EnumConfigCacheService;
import com.red.circle.other.infra.database.cache.service.user.CacheEnumConfigManagerService;
import com.red.circle.other.infra.database.rds.entity.sys.EnumConfig;
import com.red.circle.other.infra.database.rds.service.sys.EnumConfigService;
import com.red.circle.other.inner.enums.config.EnumConfigKey;
import com.red.circle.other.inner.model.dto.sys.EnumConfigDTO;
import com.red.circle.tool.core.obj.ObjectUtils;
import java.math.BigDecimal;
import java.util.List;
import java.util.Optional;
import lombok.AllArgsConstructor;
import org.springframework.stereotype.Service;

/**
 * @author pengliang on 2020/12/3
 */
@Service
@AllArgsConstructor
public class CacheEnumConfigManagerServiceImpl implements CacheEnumConfigManagerService {

  private final EnumConfigConvertor enumConfigConvertor;
  private final EnumConfigService enumConfigService;
  private final EnumConfigCacheService enumConfigCacheService;

//  @Override
//  public List<EnumConfigCache> listAppEnumConfigCache(String sysOrigin) {
//    return enumConfigCacheService.listAppEnumConfigCache(() ->
//            enumConfigConvertor.toListEnumConfigCache(enumConfigService.listReturnAppConfig(sysOrigin)),
//        sysOrigin);
//  }

//  @Override
//  public EnumConfigDTO getEnumConfigCache(SysConfigEnum sysConfigEnum, String sysOrigin) {
//    return enumConfigCacheService.getByCode(sysConfigEnum.getKey(),sysOrigin);
//  }
//
//  @Override
//  public EnumConfigDTO getEnumConfigCache(String key, String sysOrigin) {
//    return enumConfigCacheService.getByCode(key,sysOrigin);
//  }

  @Override
  public String getVal(EnumConfigKey enumConfigKey, String sysOrigin) {
    return enumConfigCacheService.getValue(enumConfigKey, sysOrigin);
  }

//  @Override
//  public String getVal(String key, String sysOrigin) {
//    return Optional.ofNullable(getEnumConfigCache(key, sysOrigin))
//        .map(EnumConfigDTO::getVal)
//        .orElse(null);
//  }

//  @Override
//  public int getValInt(SysConfigEnum sysConfigEnum, String sysOrigin) {
//    return Optional.ofNullable(getEnumConfigCache(sysConfigEnum, sysOrigin))
//        .map(EnumConfigDTO::getValInteger)
//        .orElse(0);
//  }
//
//  @Override
//  public BigDecimal getValBigDecimal(SysConfigEnum sysConfigEnum, String sysOrigin) {
//    return Optional.ofNullable(getEnumConfigCache(sysConfigEnum, sysOrigin))
//        .map(EnumConfigDTO::getValBigDecimal)
//        .orElse(BigDecimal.ZERO);
//  }

  @Override
  public boolean getValBool(SysConfigEnum sysConfigEnum, String sysOrigin) {
    EnumConfigDTO enumConfigDTO = enumConfigCacheService.getByCode(sysConfigEnum.getKey(),
        sysOrigin);
    return ObjectUtils.isNull(enumConfigDTO);
  }

  @Override
  public List<EnumConfig> listBySysOrigin(String sysOrigin) {
    return enumConfigService
        .query().eq(EnumConfig::getSysOrigin, sysOrigin)
        .orderByDesc(EnumConfig::getCreateTime)
        .last(PageConstant.formatLimit(1000))
        .list();
  }

  @Override
  public void saveAll(List<EnumConfig> list) {
    enumConfigService.saveBatch(list);
  }

}
