package com.xy.service;

import com.xy.annotate.RestMappingController;
import com.xy.constants.CacheConstants;
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.utils.PageBean;
import com.xy.utils.R;
import com.xy.vo.SysDictItemVo;
import com.xy.vo.SysDictVo;
import io.swagger.annotations.ApiOperation;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.web.bind.annotation.*;

import javax.validation.Valid;
import java.util.List;

/***
 * 字典表管理
 * @author 谭斌
 * @date 2022/12/16 13:56
 */
@RestMappingController("dict")
public interface SysDicApiService {


    @ApiOperation("通过ID查询字典信息")
    @GetMapping("{id}")
    R<SysDictVo> getById(@PathVariable("id") Long id);


    @ApiOperation("分页查询字典信息")
    @GetMapping("page")
    R<PageBean<SysDictVo>> getDictPage(SysDictPageDto page);


    @ApiOperation("通过字典类型查找字典")
    @GetMapping("key/{key}")
    @Cacheable(value = CacheConstants.DICT_DETAILS, key = "#key")
    R<List<SysDictItemVo>> getDictByKey(@PathVariable String key);


    @ApiOperation("添加字典")
    @PostMapping("add")
    R<Boolean> add(@Valid @RequestBody SysDictDto sysDict);


    @ApiOperation("删除字典，并且清除字典缓存")
    @DeleteMapping("{id}")
    R<Boolean> removeById(@PathVariable("id") Long id);


    @ApiOperation("修改字典")
    @PostMapping("update")
    R<Boolean> updateSysDictById(@Valid @RequestBody SysDictDto sysDict);


    @ApiOperation("分页查询字典项")
    @GetMapping("item/page")
    R<PageBean<SysDictItemVo>> getSysDictItemPage(SysDictItemPageDto pageDto);


    @ApiOperation("通过id查询字典项")
    @GetMapping("item/{id}")
    R<SysDictItemVo> getDictItemById(@PathVariable("id") Long id);


    @ApiOperation("新增字典项")
    @PostMapping("addItem")
    @CacheEvict(value = CacheConstants.DICT_DETAILS, allEntries = true)
    R<Boolean> addItem(@RequestBody SysDictItemDto sysDictItem);


    @ApiOperation("修改字典项")
    @PostMapping("updateItem")
    R<Boolean> updateSysDictItemById(@RequestBody SysDictItemDto sysDictItem);


    @ApiOperation("通过id删除字典项")
    @DeleteMapping("item/{id}")
    R<Boolean> removeDictItemById(@PathVariable("id") Long id);


    @ApiOperation("清除字典缓存")
    @DeleteMapping("/cache")
    R<Boolean> clearDictCache();

}
