package com.ylcm.sys.controller;

import java.sql.Timestamp;
import java.util.Date;
import java.util.List;

import javax.servlet.http.HttpServletResponse;

import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;

import com.ylcm.sys.domain.Permission;
import com.ylcm.sys.domain.Role;
import com.ylcm.sys.service.PermissionService;
import com.ylcm.sys.service.RoleService;

import net.sf.json.JSONObject;


/**
 * 角色
 */
@Controller
public class RoleController extends BaseController {

	private Logger logger = LoggerFactory.getLogger(this.getClass());

	@Autowired
	private RoleService roleService;
	@Autowired
	private PermissionService permissionService;

	/**
	 * 跳转角色列表页面
	 * 
	 * @param model
	 * @return 角色列表页面
	 */
	@RequestMapping(value = "/rolelist.do")
	public String roleList(ModelMap model) {
		model.put("menu", "role");
		model.put("parentMenu", "admin");
		/**
		 * 1.跳转到角色列表页面
		 */
		return "system/role_list";
	}

	/**
	 * ajax检索角色列表页面
	 * 
	 * @param response
	 *            请求返回参数
	 * @param name
	 *            名称
	 * @param code
	 *            编码
	 * @param pageNo
	 *            页码
	 * @param pageSize
	 *            页面大小
	 */
	@RequestMapping(value = "/ajaxSearchRoleList.do")
	public void ajaxSearchList(HttpServletResponse response, String name,
			String code, int pageNo, int pageSize) {

		try {

			/**
			 * 1.获取信息列表总数
			 */
			int count = roleService.getRowCount(name, code, pageNo, pageSize);

			/**
			 * 2.获取信息列表
			 */
			List<Role> roleList = roleService.getRoleList(name, code, pageNo,
					pageSize);

			/**
			 * 3.返回结果
			 */
			JSONObject jsonobj = new JSONObject();
			jsonobj.put("count", count);
			jsonobj.put("code", 1);
			jsonobj.put("list", roleList);
			ajaxJson(jsonobj.toString(), response);
		} catch (Exception e) {

			/**
			 * 4.获取信息列表失败，返回结果
			 */
			logger.error(e.getMessage());
			ajaxJson("{\"code\":\"0\",\"msg\":\"获取角色信息列表失败\"}", response);
		}

	}

	/**
	 * 添加角色-页面跳转
	 * 
	 * @return 添加角色页面
	 */
	@RequestMapping(value = "/addrole.do")
	public String addRole(ModelMap model) {

		/**
		 * 1、获取所有权限信息列表
		 */
		List<Permission> permissionList = permissionService.getAllMenus();
		
		List<Permission> funcList = permissionService.getAllFunctions(permissionList);
		/**
		 * 2、返回数据到页面
		 */
		model.put("permissionList", permissionList);
		
		model.put("funcList", funcList);
		return "system/add_role";
	}

	/**
	 * 保存角色
	 * 
	 * @param response
	 *            请求返回参数
	 * @param name
	 *            名称
	 * @param code
	 *            编码
	 * @param info
	 *            详情
	 * @param permissionId
	 *            权限id
	 */
	@RequestMapping(value = "/saverole.do")
	public void saveRole(HttpServletResponse response, String name,
			String code, String info, String permissionId) {

		/**
		 * 1.创建实体
		 */
		Role role = new Role();
		role.setName(name);
		role.setCode(code);
		role.setInfo(info);
		Timestamp timestamp = new Timestamp(new Date().getTime());
		role.setCrtTime(timestamp);
		role.setUpdTime(timestamp);

		try {

			/**
			 * 2.调用保存接口
			 */
			roleService.addRole(role);

			/**
			 * 3.添加角色权限
			 */
			if (role.getRoleId() > 0) {
				if (StringUtils.isNotBlank(permissionId)) {
					permissionService.addRolePermissions(permissionId,role.getRoleId());
				}
			}

			/**
			 * 4.返回结果
			 */
			ajaxJson("{\"code\":\"1\",\"msg\":\"添加角色成功\"}", response);

		} catch (Exception e) {
			
			/**
			 * 5、添加角色失败，返回结果
			 */
			e.printStackTrace();
			ajaxJson("{\"code\":\"0\",\"msg\":\"添加角色失败\"}", response);
		}
	}

	/**
	 * 修改-页面跳转
	 * 
	 * @param roleId
	 *            角色id
	 * @param model
	 * @return 修改角色页面
	 */
	@RequestMapping(value = "/editrole.do")
	public String editRole(int roleId, ModelMap model) {

		/**
		 * 1.查寻实体
		 */
		Role role = roleService.getRoleById(roleId);
		StringBuffer sb = new StringBuffer(",");
		if(role != null){
			for(Permission p : role.getPerms()){
				sb.append(p.getPermissionId() + ",");
			}
			for(Permission p : role.getFuncs()){
				sb.append(p.getPermissionId() + ",");
			}
		}
		model.put("rolePerms", sb.toString());
		/**
		 * 2.获取所有权限信息列表
		 */
		List<Permission> permissionList = permissionService.getAllMenus();
		
		List<Permission> funcList = permissionService.getAllFunctions(permissionList);
		

		/**
		 * 3.返回数据到页面
		 */
		model.put("permissionList", permissionList);
		model.put("funcList", funcList);
		model.put("role", role);
		return "system/update_role";
	}

	/**
	 * 修改角色
	 * 
	 * @param response
	 *            请求返回参数
	 * @param roleId
	 *            角色id
	 * @param name
	 *            名称
	 * @param code
	 *            编码
	 * @param info
	 *            角色信息
	 * @param permissionId
	 *            权限id
	 */
	@RequestMapping(value = "/updaterole.do")
	public void updateRole(HttpServletResponse response, int roleId,
			String name, String code, String info, String permissionId) {

		/**
		 * 1.根据id查寻实体
		 */
		Role role = roleService.getRoleById(roleId);

		if (role == null) {
			ajaxJson("{\"code\":\"0\",\"msg\":\"角色不存在\"}", response);
		}

		/**
		 * 2.修改实体
		 */
		role.setName(name);
		role.setCode(code);
		role.setInfo(info);
		role.setUpdTime(new Timestamp(new Date().getTime()));

		try {

			/**
			 * 3.调用修改接口
			 */
			roleService.updRole(role);

			/**
			 * 4.根据角色删除所有权限
			 */
			permissionService.delRolePermissionsById(roleId);

			/**
			 * 5.添加角色权限
			 */
			if (StringUtils.isNotBlank(permissionId)) {
				permissionService.addRolePermissions(permissionId, roleId);
			}

			/**
			 * 6.返回结果
			 */
			ajaxJson("{\"code\":\"1\",\"msg\":\"修改角色成功\"}", response);

		} catch (Exception e) {

			/**
			 * 7.修改角色，返回结果
			 */
			logger.error(e.getMessage());
			ajaxJson("{\"code\":\"0\",\"msg\":\"修改角色失败\"}", response);
		}

	}

	/**
	 * 删除角色
	 * 
	 * @param response
	 *            请求返回参数
	 * @param roleId
	 *            角色id
	 */
	@RequestMapping(value = "/deleterole.do")
	public void deleteRole(HttpServletResponse response, int roleId) {

		try {

			/**
			 * 1.调用删除接口
			 */
			roleService.delRole(roleId);

			/**
			 * 2.返回结果
			 */
			ajaxJson("{\"code\":\"1\",\"msg\":\"删除角色成功\"}", response);

		} catch (Exception e) {

			/**
			 * 3.删除角色失败，返回结果
			 */
			logger.error(e.getMessage());
			ajaxJson("{\"code\":\"0\",\"msg\":\"删除角色失败\"}", response);
		}

	}
}
