package com.ibeetl.admin.core.web;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.ibeetl.admin.core.conf.PasswordConfig.PasswordEncryptService;
import com.ibeetl.admin.core.entity.CoreOrg;
import com.ibeetl.admin.core.entity.CoreUser;
import com.ibeetl.admin.core.rbac.UserLoginInfo;
import com.ibeetl.admin.core.rbac.tree.FunctionItem;
import com.ibeetl.admin.core.rbac.tree.MenuItem;
import com.ibeetl.admin.core.rbac.tree.OrgItem;
import com.ibeetl.admin.core.service.CorePlatformService;
import com.ibeetl.admin.core.service.CoreUserService;
import com.ibeetl.admin.core.util.DictUtil;
import com.ibeetl.admin.core.util.HttpRequestLocal;
import com.ibeetl.admin.core.web.dto.FunctionNodeView;
import com.ibeetl.admin.core.web.dto.MenuNodeView;
import com.ibeetl.admin.core.web.dto.SystemMenuView;

@Controller
@SuppressWarnings("unchecked")
public class CoreUserController {
	private final Log log = LogFactory.getLog(this.getClass());
	private static final String MODEL = "/core/user";

	@Autowired
	CorePlatformService platformService;

	@Autowired
	CoreUserService userService;

	@Autowired
	HttpRequestLocal httpRequestLocal;

	@Autowired
	DictUtil dictUtil;

	
	@Autowired
	PasswordEncryptService passwordEncryptService ;

	@PostMapping(MODEL + "/login.json")
	@ResponseBody
	public JsonResult<UserLoginInfo> login(String code, String password) {
		UserLoginInfo info = userService.login(code, password);
		if (info == null) {
			
			return JsonResult.failMessage("用户名密码错");
		}
		CoreUser user = info.getUser();
		CoreOrg currentOrg = info.getOrgs().get(0);
		for (CoreOrg org : info.getOrgs()) {
			if (org.getId() == user.getOrgId()) {
				currentOrg = org;
				break;
			}
		}

		info.setCurrentOrg(currentOrg);
		// 记录登录信息到session
		this.platformService.setLoginUser(info.getUser(), info.getCurrentOrg(), info.getOrgs());
		return JsonResult.success(info);
	}

	/**
	 * 用户所在部门
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/myOrgs.json")
	@ResponseBody
	public JsonResult<List<CoreOrg>> myOrgs() {
		List<CoreOrg> orgs = (List<CoreOrg>) httpRequestLocal.getSessionValue(CorePlatformService.ACCESS_USER_ORGS);
		return JsonResult.success(orgs);

	}

	/**
	 * 切换部门
	 * 
	 * @param code
	 * @param orgId
	 * @return
	 */
	@PostMapping(MODEL + "/setOrg.json")
	@ResponseBody
	public JsonResult login(Long orgId) {

		CoreUser user = platformService.getCurrentUser();

		// 检查是否存在orgId
		List<CoreOrg> orgs = platformService.getCurrentOrgs();
		CoreOrg currentOrg = null;
		for (CoreOrg org : orgs) {
			if (orgId == org.getId()) {
				currentOrg = org;
				break;
			}
		}
		if (currentOrg == null) {
			// 非法切换
			return JsonResult.failMessage("切换到不存在的部门");
		}

		httpRequestLocal.setSessionValue(CorePlatformService.ACCESS_CURRENT_ORG, currentOrg);

		return JsonResult.success();
	}

	@PostMapping(MODEL + "/changePassword.json")
	@ResponseBody
	public JsonResult chnagePassword(String password, String newPassword) {
		CoreUser temp = platformService.getCurrentUser();
		CoreUser realUser = userService.getUserById(temp.getId());
		String pwd = passwordEncryptService.password(password);
		if (realUser.getPassword().equals(pwd)) {
			realUser.setPassword(passwordEncryptService.password(newPassword));
			userService.update(realUser);
			return JsonResult.success();
		} else {
			return JsonResult.failMessage("密码错误");
		}

	}

	/**
	 * 用户能查看的菜单
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/menu/menuTree.json")
	@ResponseBody
	public JsonResult<List<MenuNodeView>> menus() {
		CoreUser currentUser = platformService.getCurrentUser();
		Long orgId = platformService.getCurrentOrgId();
		MenuItem item = platformService.getMenuItem(currentUser.getId(), orgId);
		List<MenuNodeView> view = this.build(item);
		return JsonResult.success(view);
	}

	/**
	 * 获取系统
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/menu/system.json")
	@ResponseBody
	public JsonResult<List<SystemMenuView>> getSystem() {
		CoreUser currentUser = platformService.getCurrentUser();
		Long orgId = platformService.getCurrentOrgId();
		MenuItem menuItem = platformService.getMenuItem(currentUser.getId(), orgId);
		List<MenuItem> list = menuItem.getChildren();
		List<SystemMenuView> systems = new ArrayList<SystemMenuView>();
		for (MenuItem item : list) {
			systems.add(new SystemMenuView(item.getId(), item.getData().getCode(), item.getData().getName()));
		}
		return 	JsonResult.success(systems);
	}

	/**
	 * 获取系统对应的菜单树
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/menu/systemMenu.json")
	@ResponseBody
	public JsonResult<List<MenuNodeView>> getMenuBySystem(long systemId) {
		CoreUser currentUser = platformService.getCurrentUser();
		Long orgId = platformService.getCurrentOrgId();
		MenuItem menuItem = platformService.getMenuItem(currentUser.getId(), orgId);
		MenuItem item = menuItem.findChild(systemId);
		List<MenuNodeView> view = this.build(item);
		return JsonResult.success(view);
	}

	/**
	 * 用户所在公司的组织机构树
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/org.json")
	@ResponseBody
	public JsonResult<OrgItem> getUserCompany() {
		OrgItem orgItem = platformService.getUserOrgTree();
		return JsonResult.success(orgItem);
	}

	/**
	 * 获取系统的菜单树
	 * 
	 * @return
	 */
	@PostMapping(MODEL + "/menu/tree.json")
	@ResponseBody
	public JsonResult<List<MenuNodeView>> getMenuTree() {
		MenuItem menuItem = platformService.buildMenu();
		List<MenuNodeView> view = this.build(menuItem);
		return JsonResult.success(view);
	}
	/**
	 * 获取功能点树
	 * @return
	 */
	@PostMapping(MODEL + "/function/tree.json")
    @ResponseBody
    public JsonResult<List<FunctionNodeView> > getFunctionTree() {
    		FunctionItem root = this.platformService.buildFunction();
    		List<FunctionNodeView> tree = buildFunctionTree(root);
    		return JsonResult.success(tree);
       
    }

	
	private List<MenuNodeView> build(MenuItem node) {
		List<MenuItem> list = node.getChildren();
		if (list.size() == 0) {
			return Collections.EMPTY_LIST;
		}

		List<MenuNodeView> views = new ArrayList<MenuNodeView>(list.size());

		for (MenuItem item : list) {
			MenuNodeView view = new MenuNodeView();
			view.setCode(item.getData().getCode());
			view.setName(item.getData().getName());
			view.setIcon(item.getData().getIcon());
			view.setId(item.getData().getId());
			view.setPath((String) item.getData().get("accessUrl"));
			List<MenuNodeView> children = this.build(item);
			view.setChildren(children);
			views.add(view);
		}
		return views;
	}
	
    private List<FunctionNodeView> buildFunctionTree(FunctionItem node){
  		List<FunctionItem> list = node.getChildren();
      	if(list.size()==0){
      		return Collections.EMPTY_LIST;
      	}
      	List<FunctionNodeView> views = new ArrayList<FunctionNodeView>(list.size());
      	for(FunctionItem item :list){
      		FunctionNodeView view = new FunctionNodeView();
      		view.setCode(item.getData().getCode());
      		view.setName(item.getData().getName());
      		view.setId(item.getData().getId());
      		view.setAccessUrl(item.getData().getAccessUrl());
      		List<FunctionNodeView> children = this.buildFunctionTree(item);
      		view.setChildren(children);
      		views.add(view);
      	}
      	return views;
     }

}
