package cn.wisenergy.chnmuseum.party.web.controller;

import cn.wisenergy.chnmuseum.party.common.log.MethodLog;
import cn.wisenergy.chnmuseum.party.common.log.OperModule;
import cn.wisenergy.chnmuseum.party.common.log.OperType;
import cn.wisenergy.chnmuseum.party.common.util.DateUtil80;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import cn.wisenergy.chnmuseum.party.web.controller.base.BaseController;
import cn.wisenergy.chnmuseum.party.model.TOrgan;
import cn.wisenergy.chnmuseum.party.service.TOrganService;
import cn.wisenergy.chnmuseum.party.common.enums.AuditStatusEnum;
import cn.wisenergy.chnmuseum.party.common.validator.groups.Add;
import cn.wisenergy.chnmuseum.party.common.validator.groups.Update;
import cn.wisenergy.chnmuseum.party.common.vo.GenericPageParam;

import com.beust.jcommander.Parameter;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.SystemUtils;
import org.apache.ibatis.annotations.Param;
import org.apache.shiro.authz.annotation.RequiresPermissions;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;
import javax.validation.constraints.NotNull;
import java.util.List;
import java.util.Map;

/**
 * <pre>
 * 机构 前端控制器
 * </pre>
 *
 * @author Danny Lee
 * @since 2021-03-22
 */
@Slf4j
@RestController
@RequestMapping("/organ")
@Api(tags = {"机构操作接口"})
public class TOrganController extends BaseController {

    @Resource
    private TOrganService tOrganService;


    @PostMapping("/add")
    @RequiresPermissions("/organ/add")
    @ApiOperation(value = "添加机构", notes = "添加机构")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.添加)
    public Map<String, Object> add(TOrgan organ) {
        organ.setCreateTime(DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis()));
        organ.setUpdateTime(DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis()));
        // 保存业务节点信息
        boolean result = tOrganService.save(organ);
        // 返回操作结果
        if (result) {
            return getSuccessResult();
        } else {
            // 保存失败
            return getFailResult();
        }
    }

    @PutMapping("/update")
    @RequiresPermissions("/organ/update")
    @ApiOperation(value = "update", notes = "修改机构信息")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.修改)
    public Map<String, Object> updateTOrgan(TOrgan tOrgan) {
        tOrgan.setUpdateTime(DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis()));
        boolean flag = tOrganService.updateById(tOrgan);
        if (flag) {
            return getSuccessResult();
        }
        return getFailResult();
    }

//	@PutMapping("/updateAuditStatus")
//	@RequiresPermissions("/organ/updateAuditStatus")
//	@ApiOperation(value = "更新机构审核状态", notes = "更新机构审核状态")
//	@ApiImplicitParams(value = {
//			@ApiImplicitParam(name = "id", value = "标识ID", dataType = "String", paramType = "path"),
//			@ApiImplicitParam(name = "status", value = "状态", paramType = "query", dataType = "String")
//	})
//	public Map<String, Object> updateStatus(@NotNull(message = "机构ID不能为空") @PathVariable("id") String id, @RequestParam("status") AuditStatusEnum status) {
//		UpdateWrapper<TOrgan> updateWrapper = new UpdateWrapper<>();
//		updateWrapper.eq("id", id);
//		updateWrapper.eq("audit_status", status.name());
//		boolean flag = tOrganService.update(updateWrapper);
//		if (flag) {
//		return getSuccessResult();
//		}
//		return getFailResult();
//    }

    @DeleteMapping("/delete")
    @RequiresPermissions("/organ/delete")
    @ApiOperation(value = "根据ID删除机构", notes = "根据ID删除机构")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.删除)
    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "id", value = "标识ID", paramType = "path", dataType = "String")
    })
    public Map<String, Object> deleteTOrgan(@PathVariable("id") String id) {
        UpdateWrapper<TOrgan> updateWrapper = new UpdateWrapper<>();
        updateWrapper.eq("id", id);
        updateWrapper.eq("is_deleted", 1);
        updateWrapper.eq("update_time", DateUtil80.getDateTimeOfTimestamp(System.currentTimeMillis()));
        boolean result = tOrganService.update(updateWrapper);
        if (result) {
            return getSuccessResult();
        }
        return getFailResult();
    }

    @GetMapping("/getList")
    @RequiresPermissions("/organ/getList")
    @ApiOperation(value = "获取机构全部列表(无分页)", notes = "获取机构全部列表(无分页)")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.查询)
    public Map<String, Object> getTOrganList() {
        List<TOrgan> tOrganList = tOrganService.list(Wrappers.<TOrgan>lambdaQuery().eq(TOrgan::getIsDeleted, 0));
        return getResult(tOrganList);
    }

    @ApiImplicitParams(value = {
            @ApiImplicitParam(name = "_index", value = "分页起始偏移量", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "_size", value = "返回条数", paramType = "query", dataType = "Integer"),
            @ApiImplicitParam(name = "nameOrCode", value = "名称或编码", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "startDate", value = "创建时间-开始", paramType = "query", dataType = "String"),
            @ApiImplicitParam(name = "endDate", value = "创建时间-结束", paramType = "query", dataType = "String")
    })
    @PostMapping("/getPageList")
    @RequiresPermissions("/organ/getPageList")
    @ApiOperation(value = "获取机构分页列表", notes = "获取机构分页列表")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.查询)
    public Map<String, Object> getTOrganPageList(GenericPageParam genericPageParam) {
        LambdaQueryWrapper<TOrgan> queryWrapper = new LambdaQueryWrapper<>();
        // 对名称或编码模糊查询
        if (StringUtils.isNotBlank(genericPageParam.getNameOrCode())) {
            queryWrapper.like(TOrgan::getName, genericPageParam.getNameOrCode());
        }
        // 根据创建时间区间检索
        if (genericPageParam.getStartDate() != null && genericPageParam.getEndDate() != null) {
            queryWrapper.ge(TOrgan::getCreateTime, genericPageParam.getStartDate().atTime(0, 0, 0))
                    .le(TOrgan::getCreateTime, genericPageParam.getEndDate().atTime(23, 59, 59));
        }
        // 设置排序规则
        queryWrapper.orderByDesc(TOrgan::getCreateTime);
        Page<TOrgan> page = this.tOrganService.page(getPage(), queryWrapper);
        return getResult(page);
    }

    @ApiOperation(value = "获取机构详情", notes = "获取机构详情")
    @GetMapping("/getById")
    @RequiresPermissions("/organ/getById")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.查询)
    public Map<String, Object> getById(String id) {
        TOrgan tOrgan = tOrganService.getById(id);
        return getResult(tOrgan);
    }


	@GetMapping("/getTree")
	@RequiresPermissions("/organ/getTree")
	@ApiOperation(value = "获取机构树", notes = "获取机构树")
    @MethodLog(operModule = OperModule.机构管理,operType = OperType.查询)
	public Map<String, Object> getTree() {
		List<TOrgan> tOrganList = tOrganService.getTree();
		return getResult(tOrganList);
	}

}