package com.jwipc.sys.client.impl;

import cn.hutool.core.collection.CollUtil;
import com.jwipc.sys.client.DictClient;
import com.jwipc.sys.client.convert.DictClientConvert;
import com.jwipc.sys.client.dto.DictDTO;
import com.jwipc.sys.model.po.DictByTypePO;
import com.jwipc.sys.service.IDictService;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * <p> </p>
 *
 * @author ZhangJie
 * @version 1.0
 * @since JDK 1.8
 */
@Service
@RequiredArgsConstructor
public class DictClientImpl implements DictClient {
    private final IDictService dictService;
    private final DictClientConvert dictClientConvert;

    public List<DictDTO> getDicByType(String type) {
        List<DictByTypePO> dict = dictService.findDictByType(type);
        return dictClientConvert.byTypePOs2DTOs(dict);
    }

    public DictDTO getDictByTypeAndCode(String type, String code) {
        DictByTypePO dictByTypePO = dictService.findDictByTypeAndCode(type, code);
        return dictClientConvert.po2Dto(dictByTypePO);
    }

    public DictDTO getDictByTypeAndName(String type, String name) {
        DictByTypePO dictByTypePO = dictService.findDictByTypeAndName(type, name);
        return dictClientConvert.po2Dto(dictByTypePO);
    }

    @Override
    public Map<String, String> getDicMapByType(String type) {
        List<DictByTypePO> dict = dictService.findDictByType(type);
        if (CollUtil.isNotEmpty(dict)) {
            return dict.stream().collect(Collectors.toMap(DictByTypePO::getCode, DictByTypePO::getName));
        }
        return Map.of();
    }

    @Override
    public Map<String, String> getDicMapByTypeNameKey(String type) {
        List<DictByTypePO> dict = dictService.findDictByType(type);
        if (CollUtil.isNotEmpty(dict)) {
            return dict.stream().collect(Collectors.toMap(DictByTypePO::getName, DictByTypePO::getCode,
                    (existingValue, newValue) -> existingValue));
        }
        return Map.of();
    }
}
