package com.xy.service;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.xy.dto.SysDict.SysDictDto;
import com.xy.dto.SysDict.SysDictItemDto;
import com.xy.dto.SysDict.SysDictItemPageDto;
import com.xy.dto.SysDict.SysDictPageDto;
import com.xy.entity.SysDict;
import com.xy.entity.SysDictItem;
import com.xy.utils.Beans;
import com.xy.utils.PageBean;
import com.xy.utils.R;
import com.xy.vo.SysDictItemVo;
import com.xy.vo.SysDictVo;
import io.swagger.annotations.Api;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

import static com.xy.utils.Beans.copy;
import static com.xy.utils.PlusBeans.toIPage;
import static com.xy.utils.PlusBeans.toPageBean;

@Service
@RequiredArgsConstructor
@Api(tags = "字典表管理API")
public class SysApiServiceImpl implements SysDicApiService {


    private final SysDictItemService sysDictItemService;

    private final SysDictService sysDictService;

    @Override
    public R<SysDictVo> getById(Long id) {
        return R.ok(Beans.copy(SysDictVo.class, sysDictItemService.getById(id)));
    }


    @Override
    public R<PageBean<SysDictVo>> getDictPage(SysDictPageDto dto) {
        PageBean pageBean = dto.getPage();
        IPage page = sysDictService.page(toIPage(pageBean), Wrappers.<com.xy.entity.SysDict>lambdaQuery()
                .like(StrUtil.isNotBlank(dto.getDictKey()), com.xy.entity.SysDict::getDictKey, dto.getDictKey()));
        return R.ok(toPageBean(SysDictVo.class, page));
    }

    @Override
    public R<List<SysDictItemVo>> getDictByKey(String key) {
        List<SysDictItem> sysDictItemList = sysDictItemService.list(Wrappers.<SysDictItem>lambdaQuery().eq(SysDictItem::getDictKey, key));
        return R.ok(copy(SysDictItemVo.class, sysDictItemList));
    }

    @Override
    public R<Boolean> add(SysDictDto sysDictDto) {
        return R.ok(sysDictService.save(copy(SysDict.class, sysDictDto)));
    }

    @Override
    public R<Boolean> removeById(Long id) {
        sysDictService.removeDict(id);
        return R.ok();
    }

    @Override
    public R<Boolean> updateSysDictById(SysDictDto sysDictDto) {
        sysDictService.updateDict(copy(com.xy.entity.SysDict.class, sysDictDto));
        return R.ok();
    }

    @Override
    public R<PageBean<SysDictItemVo>> getSysDictItemPage(SysDictItemPageDto pageDto) {
        PageBean pageBean = pageDto.getPage();
        SysDictItem sysDictItem = copy(SysDictItem.class, pageDto);
        IPage page = sysDictItemService.page(toIPage(pageBean), Wrappers.query(sysDictItem));
        return R.ok(toPageBean(SysDictItemVo.class, page));
    }

    @Override
    public R<SysDictItemVo> getDictItemById(Long id) {
        return R.ok(copy(SysDictItemVo.class, sysDictItemService.getById(id)));
    }

    @Override
    public R<Boolean> addItem(SysDictItemDto sysDictItemDto) {
        return R.ok(sysDictItemService.save(copy(SysDictItem.class, sysDictItemDto)));
    }

    @Override
    public R<Boolean> updateSysDictItemById(SysDictItemDto sysDictItemDto) {
        sysDictItemService.updateDictItem(copy(SysDictItem.class, sysDictItemDto));
        return R.ok();
    }

    @Override
    public R<Boolean> removeDictItemById(Long id) {
        sysDictItemService.removeDictItem(id);
        return R.ok();
    }

    @Override
    public R<Boolean> clearDictCache() {
        sysDictService.clearDictCache();
        return R.ok();
    }
}
