package com.jeecms.cms.action.admin.main;

import static com.jeecms.common.page.SimplePage.cpn;

import javax.servlet.http.HttpServletRequest;

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.jeecms.cms.entity.main.CmsLog;
import com.jeecms.cms.entity.main.CmsSite;
import com.jeecms.cms.manager.main.CmsLogMng;
import com.jeecms.cms.web.CmsUtils;
import com.jeecms.cms.web.WebErrors;
import com.jeecms.common.page.Pagination;
import com.jeecms.common.web.CookieUtils;

@Controller
public class CmsLogAct {
	private static final Logger log = LoggerFactory.getLogger(CmsLogAct.class);

	@RequestMapping("/log/v_list_operating.do")
	public String listOperating(String queryUsername, String queryTitle,
			String queryIp, Integer pageNo, HttpServletRequest request,
			ModelMap model) {
		CmsSite site = CmsUtils.getSite(request);
		Pagination pagination = manager.getPage(CmsLog.OPERATING, site.getId(),
				queryUsername, queryTitle, queryIp, cpn(pageNo), CookieUtils
						.getPageSize(request));
		model.addAttribute("pagination", pagination);
		model.addAttribute("pageNo", pagination.getPageNo());
		model.addAttribute("queryUsername", queryUsername);
		model.addAttribute("queryTitle", queryTitle);
		model.addAttribute("queryIp", queryIp);
		return "log/list_operating";
	}

	@RequestMapping("/log/v_list_login_success.do")
	public String listLoginSuccess(String queryUsername, String queryTitle,
			String queryIp, Integer pageNo, HttpServletRequest request,
			ModelMap model) {
		Pagination pagination = manager.getPage(CmsLog.LOGIN_SUCCESS, null,
				queryUsername, queryTitle, queryIp, cpn(pageNo), CookieUtils
						.getPageSize(request));
		model.addAttribute("pagination", pagination);
		model.addAttribute("pageNo", pagination.getPageNo());
		model.addAttribute("queryUsername", queryUsername);
		model.addAttribute("queryTitle", queryTitle);
		model.addAttribute("queryIp", queryIp);
		return "log/list_login_success";
	}

	@RequestMapping("/log/v_list_login_failure.do")
	public String listLoginFailure(String queryTitle, String queryIp,
			Integer pageNo, HttpServletRequest request, ModelMap model) {
		Pagination pagination = manager.getPage(CmsLog.LOGIN_FAILURE, null,
				null, queryTitle, queryIp, cpn(pageNo), CookieUtils
						.getPageSize(request));
		model.addAttribute("pagination", pagination);
		model.addAttribute("pageNo", pagination.getPageNo());
		model.addAttribute("queryTitle", queryTitle);
		model.addAttribute("queryIp", queryIp);
		return "log/list_login_failure";
	}

	@RequestMapping("/log/o_delete_operating.do")
	public String deleteOperating(String queryUsername, String queryTitle,
			String queryIp, Integer[] ids, Integer pageNo,
			HttpServletRequest request, ModelMap model) {
		WebErrors errors = validateDelete(ids, request);
		if (errors.hasErrors()) {
			return errors.showErrorPage(model);
		}
		CmsLog[] beans = manager.deleteByIds(ids);
		for (CmsLog bean : beans) {
			log.info("delete CmsLog id={}", bean.getId());
		}
		return listOperating(queryUsername, queryTitle, queryIp, pageNo,
				request, model);
	}

	@RequestMapping("/log/o_delete_operating_batch.do")
	public String deleteOperatingBatch(Integer days,
			HttpServletRequest request, ModelMap model) {
		CmsSite site = CmsUtils.getSite(request);
		manager.deleteBatch(CmsLog.OPERATING, site.getId(), days);
		model.addAttribute("message", "global.success");
		return listOperating(null, null, null, 1, request, model);
	}

	@RequestMapping("/log/o_delete_login_success.do")
	public String deleteLoginSuccess(String queryUsername, String queryTitle,
			String queryIp, Integer[] ids, Integer pageNo,
			HttpServletRequest request, ModelMap model) {
		WebErrors errors = validateDelete(ids, request);
		if (errors.hasErrors()) {
			return errors.showErrorPage(model);
		}
		CmsLog[] beans = manager.deleteByIds(ids);
		for (CmsLog bean : beans) {
			log.info("delete CmsLog id={}", bean.getId());
		}
		return listLoginSuccess(queryUsername, queryTitle, queryIp, pageNo,
				request, model);
	}

	@RequestMapping("/log/o_delete_login_success_batch.do")
	public String deleteLoginSuccessBatch(Integer days,
			HttpServletRequest request, ModelMap model) {
		if (days == null) {
			days = 0;
		}
		manager.deleteBatch(CmsLog.LOGIN_SUCCESS, null, days);
		model.addAttribute("message", "global.success");
		return listLoginSuccess(null, null, null, 1, request, model);
	}

	@RequestMapping("/log/o_delete_login_failure.do")
	public String deleteLoginFailure(String queryTitle, String queryIp,
			Integer[] ids, Integer pageNo, HttpServletRequest request,
			ModelMap model) {
		WebErrors errors = validateDelete(ids, request);
		if (errors.hasErrors()) {
			return errors.showErrorPage(model);
		}
		CmsLog[] beans = manager.deleteByIds(ids);
		for (CmsLog bean : beans) {
			log.info("delete CmsLog id={}", bean.getId());
		}
		return listLoginFailure(queryTitle, queryIp, pageNo, request, model);
	}

	@RequestMapping("/log/o_delete_login_failure_batch.do")
	public String deleteLoginFailureBatch(Integer days,
			HttpServletRequest request, ModelMap model) {
		if (days == null) {
			days = 0;
		}
		manager.deleteBatch(CmsLog.LOGIN_FAILURE, null, days);
		model.addAttribute("message", "global.success");
		return listLoginFailure(null, null, 1, request, model);
	}

	private WebErrors validateDelete(Integer[] ids, HttpServletRequest request) {
		WebErrors errors = WebErrors.create(request);
		CmsSite site = CmsUtils.getSite(request);
		if (errors.ifEmpty(ids, "ids")) {
			return errors;
		}
		for (Integer id : ids) {
			vldExist(id, site.getId(), errors);
		}
		return errors;
	}

	private boolean vldExist(Integer id, Integer siteId, WebErrors errors) {
		if (errors.ifNull(id, "id")) {
			return true;
		}
		CmsLog entity = manager.findById(id);
		if (errors.ifNotExist(entity, CmsLog.class, id)) {
			return true;
		}
		return false;
	}

	@Autowired
	private CmsLogMng manager;
}