package com.gci.boot.modules.system.controller;


import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.gci.boot.annotation.permission.DataPermission;
import com.gci.boot.common.log.annotation.AddSysLog;
import com.gci.boot.common.util.ParamsCheckUtil;
import com.gci.boot.common.util.QueryWrapperUtil;
import com.gci.boot.common.vo.Result;
import com.gci.boot.constant.CacheConstant;
import com.gci.boot.modules.system.entity.SysDictItem;
import com.gci.boot.modules.system.service.ISysDictItemService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.web.bind.annotation.*;

import javax.servlet.http.HttpServletRequest;
import java.util.Arrays;

/**
 * <p>
 *  前端控制器
 * </p>
 *
 * @author chenzhiwei
 * @since 2023-08-25
 */
@RestController
@RequestMapping("/sys/dictItem")
@Slf4j
public class SysDictItemController {
    @Autowired
    private ISysDictItemService sysDictItemService;

    /**
     * @功能：查询字典数据
     * @param sysDictItem
     * @param pageNo
     * @param pageSize
     * @param req
     * @return
     */
    @AddSysLog("查询字典项")
    @GetMapping("/list")
    public Result<IPage<SysDictItem>> queryPageList(SysDictItem sysDictItem, @RequestParam(name="pageNo", defaultValue="1") Integer pageNo,
                                                    @RequestParam(name="pageSize", defaultValue="10") Integer pageSize, HttpServletRequest req) {
        QueryWrapper<SysDictItem> queryWrapper = QueryWrapperUtil.builder()
                .table(SysDictItem.class)
                .like(SysDictItem::getItemText)
                .like(SysDictItem::getItemValue)
                .orderByAsc(SysDictItem::getSortOrder)
                .buildFromObject(sysDictItem);
        Page<SysDictItem> page = new Page<>(pageNo, pageSize);
        IPage<SysDictItem> pageList = sysDictItemService.page(page, queryWrapper);
        return Result.ok(pageList);
    }

    /**
     * @功能：新增
     * @return
     */
    @AddSysLog("添加字典项")
    @PostMapping("/add")
    public Result<SysDictItem> add(@RequestBody SysDictItem sysDictItem) {
        ParamsCheckUtil.paramsAssert()
                .notBlank(sysDictItem.getDictId(), "【字典ID】不能为空!")
                .notBlank(sysDictItem.getItemText(), "【名称】不能为空!")
                .notBlank(sysDictItem.getItemValue(), "【数据值】不能为空！")
                .notNull(sysDictItem.getStatus(), "【是否启用】不能为空！")
                .isTrue(sysDictItemService.lambdaQuery()
                        .eq(SysDictItem::getDictId, sysDictItem.getDictId())
                        .eq(SysDictItem::getItemText, sysDictItem.getItemText()).count()==0, "【名称】已存在！")
                .isTrue(sysDictItemService.lambdaQuery()
                        .eq(SysDictItem::getDictId, sysDictItem.getDictId())
                        .eq(SysDictItem::getItemValue, sysDictItem.getItemValue()).count()==0, "【数据值】已存在！")
        ;
        sysDictItemService.save(sysDictItem);
        return Result.ok("添加成功！");
    }

    /**
     * @功能：编辑
     * @param sysDictItem
     * @return
     */
    @AddSysLog("编辑字典项")
    @PutMapping("/edit")
    @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true)
    public Result<SysDictItem> edit(@RequestBody SysDictItem sysDictItem) {
        SysDictItem sysdict = sysDictItemService.getById(sysDictItem.getId());
        if(sysdict==null) {
            return Result.error("字典项不存在！");
        }
        ParamsCheckUtil.paramsAssert()
                .notBlank(sysDictItem.getDictId(), "【字典ID】不能为空!")
                .notBlank(sysDictItem.getItemText(), "【名称】不能为空!")
                .notBlank(sysDictItem.getItemValue(), "【数据值】不能为空！")
                .notNull(sysDictItem.getStatus(), "【是否启用】不能为空！")
                .isTrue(sysDictItemService.lambdaQuery()
                        .eq(SysDictItem::getDictId, sysDictItem.getDictId())
                        .ne(SysDictItem::getId, sysDictItem.getId())
                        .eq(SysDictItem::getItemText, sysDictItem.getItemText()).count()==0, "【名称】已存在！")
                .isTrue(sysDictItemService.lambdaQuery()
                        .eq(SysDictItem::getDictId, sysDictItem.getDictId())
                        .ne(SysDictItem::getId, sysDictItem.getId())
                        .eq(SysDictItem::getItemValue, sysDictItem.getItemValue()).count()==0, "【数据值】已存在！")
        ;
        sysDictItemService.updateById(sysDictItem);
        return Result.ok("编辑成功");
    }

    /**
     * @功能：删除字典数据
     * @param id
     * @return
     */
    @AddSysLog("删除字典项")
    @DeleteMapping("/delete")
    @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true)
    public Result<SysDictItem> delete(String id) {
        SysDictItem joinSystem = sysDictItemService.getById(id);
        if(joinSystem==null) {
            return Result.error("未找到对应字典项");
        }
        sysDictItemService.removeById(id);
        return Result.ok("删除成功");
    }

    /**
     * @功能：批量删除字典数据
     * @param ids
     * @return
     */
    @AddSysLog("批量删除字典项")
    @DeleteMapping("/deleteBatch")
    @CacheEvict(value=CacheConstant.SYS_DICT_CACHE, allEntries=true)
    public Result<SysDictItem> deleteBatch(String ids) {
        if(ids==null || "".equals(ids.trim())) {
            return Result.error("参数不识别！");
        }
        this.sysDictItemService.removeByIds(Arrays.asList(ids.split(",")));
        return Result.ok("删除成功!");
    }
}
