package cn.timer.api.controller.spmk;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.xiaoymin.knife4j.annotations.ApiOperationSupport;

import cn.hutool.core.bean.BeanUtil;
import cn.hutool.core.util.ArrayUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.timer.api.bean.spmk.SpmkIcon;
import cn.timer.api.bean.spmk.SpmkJqgz;
import cn.timer.api.bean.spmk.SpmkLcjd;
import cn.timer.api.bean.spmk.SpmkLcjdEmpAsso;
import cn.timer.api.bean.spmk.SpmkMb;
import cn.timer.api.bean.spmk.SpmkSpcz;
import cn.timer.api.bean.spmk.SpmkSpgl;
import cn.timer.api.bean.spmk.SpmkSpz;
import cn.timer.api.bean.spmk.SpmkSxpz;
import cn.timer.api.config.annotation.CurrentUser;
import cn.timer.api.config.annotation.UserBean;
import cn.timer.api.config.enums.CommonEnum;
import cn.timer.api.dao.spmk.SpmkSpglMapper;
import cn.timer.api.dao.spmk.SpmkSpzMapper;
import cn.timer.api.dto.spmk.SpmkMbKjDto;
import cn.timer.api.dto.spmk.SpmkSpglDto;
import cn.timer.api.dto.spmk.SpmkSpglMoveDto;
import cn.timer.api.dto.spmk.SpmkSpglSortDto;
import cn.timer.api.dto.spmk.SpmkSpzDto;
import cn.timer.api.dto.spmk.SpmkSpzSortDto;
import cn.timer.api.dto.spmk.SpmkSpzSpglDto;
import cn.timer.api.utils.Result;
import cn.timer.api.utils.ResultUtil;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;

@Api(tags = "3.0审批模块")
@RestController
@Transactional
@RequestMapping(value = "/spmk",  
produces = { "application/json","multipart/form-data" })
public class SpmkServiceImpl {

	@Autowired
	private SpmkSpglMapper spmkSpglMapper;
	@Autowired
	private SpmkSpzMapper spmkSpzMapper;
//	@Autowired
//	private SpmkLcjdMapper spmkLcjdMapper;
//	@Autowired
//	private SpmkSxpzMapper spmkSxpzMapper;
//	@Autowired
//	private SpmkLcjdEmpAssoMapper spmkLcjdEmpAssoMapper;

	/**
	 * 审批组-列表
	 */
	@GetMapping(value = "/spzs")
	@ApiOperation(value = "审批组-列表",httpMethod = "GET")
	@ApiOperationSupport(order = 2)
	public Result<List<SpmkSpzSpglDto>> selectListspz(@CurrentUser UserBean userBean) {
		Integer orgCode = userBean.getOrgCode();

		List<SpmkSpzSpglDto> spmkSpzSpglDtos = spmkSpzMapper.selectSpglListByOrgCode(orgCode);

		return ResultUtil.data(spmkSpzSpglDtos, "获取审批组列表成功");
	}
	
	/**
	 * 审批组-新增
	 */
	@PostMapping(value = "/spzs")
	@ApiOperation(value = "审批组-新建",httpMethod = "POST")
	@ApiOperationSupport(order = 3)
	public Result<SpmkSpz> addspz(@CurrentUser UserBean userBean ,@RequestBody SpmkSpz spmkSpz) {
		Integer orgCode = userBean.getOrgCode();
		
		if (spmkSpz == null || spmkSpz.getName() == null) return ResultUtil.error("请填入审批组名");
		
		SpmkSpz one = spmkSpz.selectOne(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", spmkSpz.getName()));
		
		if (one != null) return ResultUtil.error("新增失败,换个审批组名试一试~");
		
		List<SpmkSpz> spmkSpzs = SpmkSpz.builder().build().selectList(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode));
		Integer maxSort = 0;
		if (spmkSpzs != null && spmkSpzs.size() > 0) {
			for (SpmkSpz spz : spmkSpzs) {
				Integer i = spz.getSort() == null ? 0 : spz.getSort();
				// 999999 是 【其他】 审批组 ,固定排最后
				if (maxSort < i && i < CommonEnum.SPZ_OTHER.getType()) maxSort = i;
			}
		}
		
		spmkSpz.setOrgCode(orgCode);
		spmkSpz.setIsEditable(0);
		spmkSpz.setSort(maxSort+1);
		spmkSpz.insert();
		
		return ResultUtil.data(spmkSpz, "审批组-新建成功");
	}
	
	/**
	 * 审批组-删除
	 */
	@DeleteMapping(value = "/spzs/{id}")
	@ApiOperation(value = "审批组-删除",httpMethod = "DELETE")
	@ApiOperationSupport(order = 4)
	public Result<SpmkSpz> delspz(@CurrentUser UserBean userBean ,@PathVariable("id") Integer id){
		Integer orgCode = userBean.getOrgCode();
		SpmkSpz spmkSpz = SpmkSpz.builder().build();
		
		SpmkSpz thisSpz = spmkSpz.selectById(id);
		if ("其他".equals(thisSpz.getName())) return ResultUtil.error("该审批组无法删除");
		
		SpmkSpz  otherSpz = spmkSpz.selectOne((new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("sort", CommonEnum.SPZ_OTHER.getType())));
		
		SpmkSpgl one = SpmkSpgl.builder().build().selectOne(new QueryWrapper<SpmkSpgl>().eq("spz_id", "").orderByDesc("sort").last("limit 1"));
		Integer max = (one == null || one.getSort() == null) ? 1 : one.getSort();
		List<SpmkSpgl> spmkSpgls = SpmkSpgl.builder().build().selectList(new QueryWrapper<SpmkSpgl>().eq("spz_id", id));
		if (spmkSpgls != null && spmkSpgls.size() > 0) {
			for (SpmkSpgl spmkSpgl : spmkSpgls) {
				spmkSpgl.setSort(max);
				spmkSpgl.setSpzId(otherSpz.getId());
				spmkSpgl.updateById();
				max++;
			}
		}
		
		boolean b = spmkSpz.deleteById(id);
		if(b) return ResultUtil.success("审批组-删除成功");
		return ResultUtil.error("审批组-删除失败");
	}

	/**
	 * 审批管理-编辑
	 */
	@PutMapping(value = "/spgl")
	@ApiOperation(value = "审批管理-编辑", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 9)
	public Result<SpmkSpgl> updateSpgl(@CurrentUser UserBean userBean,@RequestBody SpmkSpglDto spmkSpglDto){
		@SuppressWarnings("unused")
		Integer orgCode = userBean.getOrgCode();
		
		SpmkSpgl spmkSpgl = SpmkSpgl.builder().build();
		BeanUtil.copyProperties(spmkSpglDto, spmkSpgl, "lcjd","spyj");
		
		spmkSpgl.setMbId(null);
		spmkSpgl.setSpzId(null);
		spmkSpgl.setOrgCode(null);
		spmkSpgl.setSpyj(ArrayUtil.join(spmkSpglDto.getSpyj(),","));
		spmkSpgl.setLcjd(ObjectUtil.serialize(spmkSpglDto.getLcjd()));
		
		boolean b = spmkSpgl.updateById();
		if (!b) return ResultUtil.error("编辑管理员列失败");
		return ResultUtil.success("编辑管理员列成功");
	}
	
	/**
	 * 审批模版-新增/编辑
	 */
	@PutMapping(value = "/mb")
	@ApiOperation(value = "审批模版-新增/编辑", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 10)
	public Result<SpmkSpgl> updateMb(@CurrentUser UserBean userBean,@RequestBody SpmkMbKjDto spmkMbKjDto) {
		// TODO Auto-generated method stub

		SpmkMb spmkMb = SpmkMb.builder().build();
		BeanUtil.copyProperties(spmkMbKjDto, spmkMb, "kj");
		spmkMb.setKj(ObjectUtil.serialize(spmkMbKjDto.getKj()));
		
		boolean b = spmkMb.insertOrUpdate();
		if (!b) return ResultUtil.error("审批模版-新增/编辑失败");
		return ResultUtil.success("审批模版-新增/编辑成功");
	}
	

	/**
	 * 审批组-重命名
	 */
	@PutMapping(value = "/updatespz")
	@ApiOperation(value = "审批组-重命名", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 5)
	public Result<SpmkSpzDto> updatespz(@CurrentUser UserBean userBean,@RequestBody SpmkSpzDto spmkSpzDto) {
		// TODO Auto-generated method stub
		
		Integer orgCode = userBean.getOrgCode();
		
		if (spmkSpzDto == null || spmkSpzDto.getName() == null) return ResultUtil.error("请填入审批组名");
		
		SpmkSpz one = SpmkSpz.builder().build().selectOne(new QueryWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", spmkSpzDto.getName()));
		
		if (one != null) return ResultUtil.error("新增失败,换个审批组名试一试~");
		
		Integer id = spmkSpzDto.getId();
		String name = spmkSpzDto.getName();
		SpmkSpz.builder().id(id).name(name).build().updateById();
		return ResultUtil.data(spmkSpzDto, "审批组重命名成功");
	}

	/**
	 * 审批组-批量排序
	 */
	@PutMapping(value = "/updatespzsort")
	@ApiOperation(value = "审批组-排序", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 6)
	public Result<Void> updatespzsort(@CurrentUser UserBean userBean,@RequestBody List<SpmkSpzSortDto> spmkSpzSortDtos) {
		Integer orgCode = userBean.getOrgCode();
		SpmkSpz.builder().sort(CommonEnum.SPZ_OTHER.getType()).build().update(new UpdateWrapper<SpmkSpz>().eq("org_code", orgCode).eq("name", "其他"));
		
		Integer count = spmkSpzMapper.updateListSortById(spmkSpzSortDtos);
		System.out.println(count);
		return ResultUtil.success("审批组批量排序成功");
	}

	/**
	 * 审批管理-批量排序
	 */
	@PutMapping(value = "/updatespglsort")
	@ApiOperation(value = "审批管理-排序", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 8)
	public Result<Void> updatespglsort(@CurrentUser UserBean userBean,@RequestBody List<SpmkSpglSortDto> spmkSpglSortDtos) {
		Integer count = spmkSpglMapper.updateListSortById(spmkSpglSortDtos);
		System.out.println(count);
		return ResultUtil.success("审批管理批量排序成功");
	}

	/**
	 * 审批管理-查询
	 */
	@GetMapping(value = "/spgl/{id}")
	@ApiOperation(value = "审批管理-查询", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 11)
	public Result<SpmkSpglDto> selectspgl(@CurrentUser UserBean userBean,@PathVariable("id") Integer id) {
		SpmkSpgl spmkSpgl = spmkSpglMapper.selectSpglById2(id);
		
		if (spmkSpgl == null) {
			return ResultUtil.success();
		}
		
		SpmkSpglDto spmkSpglDto = SpmkSpglDto.builder().build();
		SpmkMbKjDto spmkMbKjDto = SpmkMbKjDto.builder().build();
		
		BeanUtil.copyProperties(spmkSpgl,spmkSpglDto, "lcjd","spmkMb");
		if (spmkSpgl.getLcjd() != null && spmkSpgl.getLcjd().length > 0) {
			spmkSpglDto.setSpyj(StrUtil.splitToInt(spmkSpgl.getSpyj(), ","));
			spmkSpglDto.setLcjd(ObjectUtil.unserialize(spmkSpgl.getLcjd()));
		}
		
		BeanUtil.copyProperties(spmkSpgl.getSpmkMb(),spmkMbKjDto, "kj");
		if (spmkSpgl.getSpmkMb() != null && spmkSpgl.getSpmkMb().getKj() != null && spmkSpgl.getSpmkMb().getKj().length > 0) {
			System.out.println(spmkSpgl.getSpmkMb().getKj());
			spmkMbKjDto.setKj(ObjectUtil.unserialize(spmkSpgl.getSpmkMb().getKj()));
		}
		
		spmkSpglDto.setSpmkMbKjDto(spmkMbKjDto);
		
		
		return ResultUtil.data(spmkSpglDto, "审批管理查询成功");
	}

	public void addlcjd(SpmkLcjd spmkLcjd, Integer upId) {
		if (spmkLcjd != null) {
			spmkLcjd.setUpId(upId);
			spmkLcjd.insert();
			System.out.println("spmkLcjdId" + spmkLcjd);
			List<SpmkSxpz> spmkSxpzs = spmkLcjd.getSpmkSxpzs();
			Integer spmkLcjdId = spmkLcjd.getId();
			if (spmkSxpzs != null && spmkSxpzs.size() > 0) {
				for (SpmkSxpz spmkSxpz : spmkSxpzs) {
					spmkSxpz.setLcjdId(spmkLcjdId);
					spmkSxpz.insert();
				}
			}

			List<SpmkLcjdEmpAsso> spmkLcjdEmpAssos = spmkLcjd.getSpmkLcjdEmpAssos();
			if (spmkLcjdEmpAssos != null && spmkLcjdEmpAssos.size() > 0) {
				for (SpmkLcjdEmpAsso spmkLcjdEmpAsso : spmkLcjdEmpAssos) {
					spmkLcjdEmpAsso.setLcjdId(spmkLcjdId);
					spmkLcjdEmpAsso.insert();
				}
			}

			List<SpmkLcjd> spmkLcjds = spmkLcjd.getSpmkLcjds();
			if (spmkLcjds != null && spmkLcjds.size() > 0) {
				for (SpmkLcjd spmkLcjd2 : spmkLcjds) {
					this.addlcjd(spmkLcjd2, spmkLcjdId);
				}
			}
		}
	}

	/**
	 * 审批管理-流程节点-批量添加/更新
	 */
	@Transactional
	@PostMapping(value = "/lcjd")
	@ApiOperation(value = "流程节点-批量添加/更新", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 12)
	public Result<Void> addlistlcjd(@CurrentUser UserBean userBean,@RequestBody SpmkLcjd spmkLcjd) {
		return null;
	}

	/**
	 * 审批操作-发起审批
	 */
	@PostMapping(value = "/spcz")
	@ApiOperation(value = "审批操作-发起审批", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 13)
	public Result<Void> addspcz(@CurrentUser UserBean userBean,@RequestBody SpmkSpcz spmkSpcz) {
			return ResultUtil.success("审批操作-发起审批成功");
	}

	/**
	 * 审批总汇-流程
	 */
	@PostMapping(value = "/sphz")
	@ApiOperation(value = "审批汇总-流程", httpMethod = "POST", notes = "接口发布说明")
	@ApiOperationSupport(order = 14)
	public Result<Void> sphz(@CurrentUser UserBean userBean) {

		return null;
	}

	/**
	 * 移动到
	 */
	@PutMapping(value = "/movespgl")
	@ApiOperation(value = "移动到", httpMethod = "PUT", notes = "接口发布说明")
	@ApiOperationSupport(order = 7)
	public Result<SpmkSpgl> moveSpgl(@CurrentUser UserBean userBean,@RequestBody SpmkSpglMoveDto spmkSpglMoveDto) {

		Integer id = spmkSpglMoveDto.getId();
		Integer spzId = spmkSpglMoveDto.getSpzId();

		List<SpmkSpgl> spgls = SpmkSpgl.builder().build().selectList(new QueryWrapper<SpmkSpgl>().eq("spz_id", spzId));
		Integer maxSort = 0;
		if (spgls != null && spgls.size() > 0) {
			for (SpmkSpgl spmkSpgl : spgls) {
				Integer i = spmkSpgl.getSort() == null ? 0 : spmkSpgl.getSort();
				if (maxSort < i)
					maxSort = i;
			}
		}
		boolean b = SpmkSpgl.builder().id(id).spzId(spzId).sort(maxSort + 1).build().updateById();

		if (!b)
			return ResultUtil.error("移动审批失败");
		return ResultUtil.success("移动审批成功");
	}

	/**
	 * 图标列表
	 */
	@GetMapping(value = "/icon")
	@ApiOperation(value = "图标列表", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<List<SpmkIcon>> selectListIcon(@CurrentUser UserBean userBean){
		
		List<SpmkIcon> spmkIcons = SpmkIcon.builder().build().selectAll();
		
		return ResultUtil.data(spmkIcons,"获取图标列表成功");
	}
	
	/**
	 * 假期规则列表
	 */
	@GetMapping(value = "/jqgz")
	@ApiOperation(value = "假期规则列表", httpMethod = "GET", notes = "接口发布说明")
	@ApiOperationSupport(order = 1)
	public Result<Object> selectListjqgz(
			@RequestParam(defaultValue = "1") Integer currentPage,
			@RequestParam(defaultValue = "10") Integer totalPage, @RequestParam Integer id,
			@CurrentUser UserBean userBean){
		
		Page<SpmkJqgz> p = new Page<SpmkJqgz>(currentPage, totalPage);
		Integer orgCode = userBean.getOrgCode();
		IPage<SpmkJqgz> sPage = SpmkJqgz.builder().build().selectPage(p, new QueryWrapper<SpmkJqgz>().eq("org_code",orgCode));
		List<SpmkJqgz> spmkJqgzs = sPage.getRecords();
		sPage.getCurrent();
		sPage.getPages();
		sPage.getTotal();
		sPage.getSize();
		return ResultUtil.data(sPage, spmkJqgzs, "获取假期规则列表成功");
	}


}