package com.ylcm.sys.controller;

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

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.common.Util;
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 PermissionController extends BaseController {

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

	@Autowired
	private PermissionService permissionService;

	@Autowired
	private RoleService roleService;

	/**
	 * 跳转权限列表页面
	 * 
	 * @param model
	 * @return 权限列表页面
	 */
	@RequestMapping(value = "/permissionlist.do")
	public String permissionList(ModelMap model) {
		model.put("menu", "permission");
		model.put("parentMenu", "admin");
		/**
		 * 1.跳转到列表页面
		 */
		return "system/permission_list";
	}

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

		try {

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

			/**
			 * 2.获取信息列表
			 */
			List<Permission> list = permissionService.getPermissionList(name,
					code, type, pageNo, pageSize);

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

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

	}

	/**
	 * 添加权限-页面跳转
	 * 
	 * @param model
	 * @return 添加权限页面
	 */
	@RequestMapping(value = "/addpermission.do")
	public String addPermission(ModelMap model) {

		/**
		 * 1.初始化父菜单，跳转到添加页面
		 */
		List<Permission> permissionList = permissionService.getMenuList();
		model.put("permissionList", permissionList);
		return "system/add_permission";
	}

	/**
	 * 保存权限
	 * 
	 * @param response
	 *            请求返回参数
	 * @param type
	 *            类型
	 * @param pid
	 *            父级id
	 * @param name
	 *            名称
	 * @param code
	 *            编码
	 * @param url
	 *            路径
	 * @param rank
	 *            排序
	 * @param logo
	 *            图标
	 */
	@RequestMapping(value = "/savepermission.do")
	public void savePermission(HttpServletResponse response, String type,
			String pid, String name, String code, String url, int rank,
			String logo) {

		/**
		 * 1.创建实体
		 */
		Permission permission = new Permission();
		permission.setType(type);
		if (Util.isNotNull(pid) && StringUtils.isNumeric(pid)) {
			permission.setPid(Integer.valueOf(pid));
		}
		permission.setName(name);
		permission.setCode(code);
		permission.setUrl(url);
		permission.setRank(Integer.valueOf(rank));
		Timestamp timestamp = new Timestamp(new Date().getTime());
		permission.setCrtTime(timestamp);
		permission.setUpdTime(timestamp);
		permission.setLogo(logo);

		try {

			/**
			 * 2.调用保存接口
			 */
			permissionService.addPermission(permission);

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

		} catch (Exception e) {

			/**
			 * 4、添加权限失败，返回结果
			 */
			logger.error(e.getMessage());
			ajaxJson("{\"code\":\"0\",\"msg\":\"添加权限失败\"}", response);
		}

	}

	/**
	 * 修改权限-页面跳转
	 * 
	 * @param permissionId
	 *            权限id
	 * @param model
	 * @return 权限修改页面
	 */
	@RequestMapping(value = "/editpermission.do")
	public String editPermission(int permissionId, ModelMap model) {

		/**
		 * 1.根据id查寻实体
		 */
		Permission permission = permissionService
				.getPermissionById(permissionId);

		/**
		 * 2.初始化父级菜单
		 */
		List<Permission> permissionList = permissionService.getMenuList();

		/**
		 * 3.将数据返回页面
		 */
		model.put("permissionList", permissionList);
		model.put("permission", permission);
		return "system/update_permission";
	}

	/**
	 * 修改权限
	 * 
	 * @param response
	 *            请求返回参数
	 * @param permissionId
	 *            权限id
	 * @param type
	 *            类型
	 * @param pid
	 *            父级id
	 * @param name
	 *            名称
	 * @param code
	 *            编码
	 * @param url
	 *            路径
	 * @param rank
	 *            排序
	 * @param logo
	 *            图标
	 */
	@RequestMapping(value = "/updatepermission.do")
	public void updatePermission(HttpServletResponse response,
			int permissionId, String type, String pid, String name,
			String code, String url, int rank, String logo) {
		/**
		 * 1.根据id查寻实体
		 */
		Permission permission = permissionService
				.getPermissionById(permissionId);

		if (permission == null) {
			ajaxJson("{\"code\":\"0\",\"msg\":\"权限不存在\"}", response);
		}

		/**
		 * 2.修改实体
		 */
		permission.setType(type);
		if (Util.isNotNull(pid) && StringUtils.isNumeric(pid)) {
			permission.setPid(Integer.valueOf(pid));
		}
		permission.setName(name);
		permission.setCode(code);
		permission.setUrl(url);
		permission.setRank(rank);
		permission.setLogo(logo);
		permission.setUpdTime(new Timestamp(new Date().getTime()));

		try {

			/**
			 * 3.调用修改接口
			 */
			permissionService.updPermission(permission);

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

		} catch (Exception e) {

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

	}

	/**
	 * 删除权限
	 * 
	 * @param response
	 *            请求返回参数
	 * @param permissionId
	 *            权限id
	 */
	@RequestMapping(value = "/deletepermission.do")
	public void deletePermission(HttpServletResponse response, int permissionId) {
		try {

			/**
			 * 1.调用删除接口
			 */
			permissionService.delPermission(permissionId);

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

		} catch (Exception e) {

			/**
			 * 3、删除权限成功，返回结果
			 */
			logger.error(e.getMessage());
			ajaxJson("{\"code\":\"0\",\"msg\":\"删除权限成功\"}", response);
		}

	}

	/**
	 * 初始化角色权限
	 * 
	 * @param model
	 * @return 页面
	 */
	@RequestMapping(value = "initrolepermission.do")
	public String initRolePermission(Map<String, Object> model) {

		/**
		 * 1、初始化角色列表
		 */
		List<Role> roleList = roleService.getRoleList();

		/**
		 * 2、获取所有权限信息列表
		 */
		List<Permission> permissionList = permissionService.getAllMenus();

		/**
		 * 3、返回数据到角色分配权限页面
		 */
		model.put("roleList", roleList);
		model.put("permissionList", permissionList);
		return "system/update_rolepermission";
	}

	/**
	 * 选择角色，根据角色获取所有权限信息
	 * 
	 * @param response
	 *            请求返回参数
	 * @param model
	 * @param roleId
	 *            角色id
	 */
	@RequestMapping(value = "getRoleForPermission.do")
	public void getRoleForPermission(HttpServletResponse response, Map<String, Object> model, int roleId) {
		/**
		 * 1、根据角色获取所有权限信息
		 */
		List<Permission> list = permissionService.getPermissionsByRoleId(roleId);
		JSONObject jsonObject = new JSONObject();
		jsonObject.put("code", 1);
		jsonObject.put("list", list);
		ajaxJson(jsonObject.toString(), response);
	}

	/**
	 * 修改角色权限
	 * 
	 * @param response
	 *            请求返回参数
	 * @param model
	 * @param permissionId
	 *            权限id
	 * @param roleId
	 *            角色id
	 */
	@RequestMapping(value = "updateRolePermission.do")
	public void updateRolePermission(HttpServletResponse response,
			Map<String, Object> model, String permissionId, int roleId) {

		try {

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

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

			/**
			 * 3、返回结果
			 */
			ajaxJson("{\"code\":\"1\",\"msg\":\"更新角色权限成功\"}", response);

		} catch (Exception e) {

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

	}
}
