package com.hotent.uc.controller;

import com.fasterxml.jackson.databind.node.ObjectNode;
import com.hotent.base.annotation.ApiGroup;
import com.hotent.base.constants.ApiGroupConsts;
import com.hotent.base.controller.BaseController;
import com.hotent.base.controller.BaseController2;
import com.hotent.base.model.CommonResult;
import com.hotent.base.query.PageList;
import com.hotent.base.query.QueryFilter;
import com.hotent.base.util.CommonResultUtil;
import com.hotent.base.util.JsonUtil;
import com.hotent.uc.manager.DemensionManager;
import com.hotent.uc.manager.OrgAuthManager;
import com.hotent.uc.model.Demension;
import com.hotent.uc.model.Org;
import com.hotent.uc.params.common.OrgExportObject;
import com.hotent.uc.params.demension.DemensionVo;
import com.hotent.uc.params.demension.OrgSelectInitVo;
import com.hotent.uc.params.user.UserVo;
import com.hotent.uc.util.AuthFilterUtil;
import com.hotent.uc.util.OrgUtil;
import com.hotent.uc.util.UpdateMethod;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import io.swagger.annotations.ApiParam;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.util.List;

/**
 * 维度模块接口
 * @author zhangxw
 *
 */
@RestController
@RequestMapping("/api/demension/v2/")
@Api(tags="维度管理2")
@ApiGroup(group= {ApiGroupConsts.GROUP_UC})
public class DemensionController2 extends BaseController2<DemensionManager, Demension> {
	
	@Resource
	DemensionManager demensionService;
	@Autowired
	OrgAuthManager orgAuthService;

	/**
	 * 获取维度列表
	 * @param filter
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dems/getDemList",method=RequestMethod.POST, produces = {
			"application/json; charset=utf-8" })
	@ApiOperation(value = "获取维度 列表", httpMethod = "POST", notes = "获取维度列表")
	public CommonResult<PageList<Demension>> getDemList(@ApiParam(name = "filter", value = "查询参数", required = true) @RequestBody QueryFilter filter) throws Exception{
		AuthFilterUtil.setDemAuthFilter(filter);
		PageList<Demension> query = demensionService.query(filter);
		return CommonResult.<PageList<Demension>>ok().value(query);
	}

	/**
	 * 添加维度
	 * @param dem
	 * @return
	 * @throws Exception
	 * 
	 */
	@RequestMapping(value="dem/addDem",method=RequestMethod.POST, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "添加维度", httpMethod = "POST", notes = "添加维度")
	public CommonResult<String> addDem(@ApiParam(name="dem",value="维度参数对象", required = true) @RequestBody DemensionVo dem) throws Exception{
		CommonResult<String> CommonResult = demensionService.addDem(dem);
		return CommonResultUtil.<String>getResult(CommonResult);
	}
	
	/**
	 * 根据维度帐号删除维度
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/deleteDem",method=RequestMethod.DELETE, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "根据维度编码批量删除维度", httpMethod = "DELETE", notes = "根据维度编码批量删除维度")
	public CommonResult<String> deleteDem(@ApiParam(name="codes",value="维度编码（多个用,号隔开）", required = true) @RequestBody(required=false) String codes) throws Exception{
		CommonResult<String> CommonResult = demensionService.deleteDem(codes);
		return CommonResultUtil.<String>getResult(CommonResult);

	}
	
	/**
	 * 根据维度ids删除维度
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/deleteDemByIds",method=RequestMethod.DELETE, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "根据维度ids批量删除维度", httpMethod = "DELETE", notes = "根据维度ids批量删除维度")
	public CommonResult<String> deleteDemByIds(@ApiParam(name="ids",value="维度id（多个用,号隔开）", required = true) @RequestParam(required=false) String ids) throws Exception{
		CommonResult<String> CommonResult = demensionService.deleteDemByIds(ids);
		return CommonResultUtil.<String>getResult(CommonResult);
	}
	
	/**
	 * 更新维度
	 * @param dem
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/updateDem",method=RequestMethod.PUT, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "更新维度", httpMethod = "PUT", notes = "更新维度")
	@UpdateMethod(type=DemensionVo.class)
	public CommonResult<String> updateDem(@ApiParam(name="dem",value="维度参数对象", required = true) @RequestBody  DemensionVo dem) throws Exception{
		CommonResult<String> CommonResult = demensionService.updateDem(dem);
		return CommonResultUtil.<String>getResult(CommonResult);
	}
	
	
	/**
	 * 获取维度信息
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/getDem",method=RequestMethod.GET, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "根据维度编码获取维度信息", httpMethod = "GET", notes = "获取维度信息")
	public CommonResult<Demension> getDem(@ApiParam(name="code",value="维度编码", required = true) @RequestParam String code) throws Exception{
		Demension dem = demensionService.getByCode(code);
		return CommonResult.<Demension>ok().value(dem);
	}
	
	/**
	 * 获取指定维度下的所有人员
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="demUser/getUsersByDem",method=RequestMethod.GET, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "获取指定维度下的所有人员", httpMethod = "GET", notes = "获取指定维度下的所有人员")
	public CommonResult<List<UserVo>> getUsersByDem(@ApiParam(name="code",value="维度编码", required = true) @RequestParam String code) throws Exception{
		List<UserVo> users = demensionService.getUsersByDem(code);
		return CommonResult.<List<UserVo>>ok().value(users);
	}
	
	/**
	 * 获取指定维度下的所有组织
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="demUser/getOrgsByDem",method=RequestMethod.GET, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "获取指定维度下的所有组织", httpMethod = "GET", notes = "获取维度下的所有组织")
	public CommonResult<List<Org>> getOrgsByDem(@ApiParam(name="code",value="维度编码", required = true) @RequestParam String code) throws Exception{
		List<Org> orgs = demensionService.getOrgsByDem(code);
		return CommonResult.<List<Org>>ok().value(orgs);
	}
	
	/**
	 * 设置默认维度
	 * @param dem
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/setDefaultDem",method=RequestMethod.PUT, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "设置默认维度", httpMethod = "PUT", notes = "设置默认维度")
	public CommonResult<String> setDefaultDem(@ApiParam(name="code",value="维度编码", required = true) @RequestParam String code) throws Exception{
		CommonResult<String> CommonResult = demensionService.setDefaultDem(code);
		return CommonResultUtil.<String>getResult(CommonResult);
	}
	
	/**
	 * 取消默认维度
	 * @param dem
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/cancelDefaultDem",method=RequestMethod.PUT, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "取消默认维度", httpMethod = "PUT", notes = "取消默认维度")
	public CommonResult<String> cancelDefaultDem(@ApiParam(name="code",value="维度编码", required = true) @RequestParam String code) throws Exception{
		CommonResult<String> CommonResult = demensionService.cancelDefaultDem(code);
		return CommonResultUtil.<String>getResult(CommonResult);
	}
	
	/**
	 * 获取默认维度信息
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/getDefaultDem",method=RequestMethod.GET, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "获取默认维度信息", httpMethod = "GET", notes = "获取默认维度信息")
	public CommonResult<Demension> getDefaultDem() throws Exception{
		Demension demension = demensionService.getDefaultDemension();
		return CommonResult.<Demension>ok().value(demension);
	}
	
	/**
	 * 物理删除所有逻辑删除了的维度数据
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/deleteDemPhysical",method=RequestMethod.DELETE, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "物理删除所有逻辑删除了的维度数据", httpMethod = "DELETE", notes = "物理删除所有逻辑删除了的维度数据")
	public CommonResult<Integer> deleteDemPhysical() throws Exception{
		Integer num = demensionService.removePhysical();
		CommonResult<Integer> CommonResult = OrgUtil.getRemovePhysiMsg(num);
		return CommonResultUtil.<Integer>getResult(CommonResult);
	}
	
	/**
	 * 根据时间获取维度数据（数据同步）
	 * @param json
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/deleteDemPhysical",method=RequestMethod.GET, produces = {
	"application/json; charset=utf-8" })
	@ApiOperation(value = "根据时间获取维度数据（数据同步）", httpMethod = "GET", notes = "根据时间获取维度数据（数据同步）")
	public CommonResult<List<Demension>> getDemByTime(@ApiParam(name="btime",value="开始时间（格式：2018-01-01 12:00:00或2018-01-01）") @RequestParam(required=false) String btime,@ApiParam(name="etime",value="结束时间（格式：2018-02-01 12:00:00或2018-02-01）") @RequestParam(required=false) String etime) throws Exception{
		OrgExportObject exportObject = new OrgExportObject();
		exportObject.setBtime(btime);
		exportObject.setEtime(etime);
		List<Demension> demensionList = demensionService.getDemByTime(exportObject);
		return CommonResult.<List<Demension>>ok().value(demensionList);
	}
	
	/**
	 * 验证编码唯一性
	 * @param code
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/isCodeExist",method=RequestMethod.GET, produces = { "application/json; charset=utf-8" })
	@ApiOperation(value = "查询维度编码是否已存在", httpMethod = "GET", notes = "查询维度编码是否已存在")
	public CommonResult<Boolean> isCodeExist(@ApiParam(name="code",value="维度编码")
												@RequestParam(required=true) String code) throws Exception{
		CommonResult<Boolean> CommonResult = demensionService.isCodeExist(code);
		return CommonResultUtil.<Boolean>getResult(CommonResult);

	}
	
	/**
	 * 查询所有机构各维度数据，并且按照从属关系组装
	 * 根据组织ID或者组织编码，初始化组织选择器控件数据（好像只是把维度Id给封装起来而已）
	 * @param code
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value="dem/getOrgSelectListInit",method=RequestMethod.GET, produces = { "application/json; charset=utf-8" })
	@ApiOperation(value = "初始化组织选择器控件数据", httpMethod = "GET", notes = "查询所有机构各维度数据，并且按照从属关系组装")
	public CommonResult<OrgSelectInitVo> getOrgSelectListInit(@RequestParam(required=true) String code) throws Exception{
		ObjectNode objectNode = demensionService.getOrgSelectListInit(code);
		OrgSelectInitVo orgSelectInitVo = new OrgSelectInitVo();
		orgSelectInitVo.setOgSelectList(objectNode.get("orgSelectList"));
		orgSelectInitVo.setInitGanAndDem(objectNode.get("initGanAndDem"));
		return CommonResult.<OrgSelectInitVo>ok().value(orgSelectInitVo);
	}
	
}
