package com.boco.nbd.wios.log.controller;

import com.boco.nbd.framework.common.PageData;
import com.boco.nbd.framework.common.ResponseMessage2;
import com.boco.nbd.framework.log.entity.SysLog;
import com.boco.nbd.framework.log.entity.annotation.SystemHandleLogInfo;
import com.boco.nbd.framework.log.entity.util.LogUtil;
import com.boco.nbd.wios.flow.util.ProcessUtil;
import com.boco.nbd.wios.log.entity.po.*;
import com.boco.nbd.wios.log.service.ISysLogService;
import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.ihidea.core.support.session.SessionInfo;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.UUID;

/**
 * @Description: 日志管理
 * @Author: ZQY
 * @Date: 2022/10/17
 **/
@RestController
@RequestMapping(value = "/customerUseLog")
@Api(tags = "日志管理类")
public class SysLogController {

	@Autowired
	private ISysLogService sysLogService;

	/**
	 * 新增操作日志
	 * 
	 * @param sysLog 
	 * @return
	 */
	@RequestMapping(value = "/insertLog", method = { RequestMethod.POST })
	@ApiOperation(value = "新增日志")
	public ResponseMessage2<Boolean> insert(@RequestBody SysLog sysLog) {
		SysLogPO customerUseLogPO = new SysLogPO(sysLog.getHandleDateTimeMillis(), sysLog.getModuleId(),
				sysLog.getBussinessName(), sysLog.getUseTime(), sysLog.getLogContent(), sysLog.getHandleConsumingTime(),
				sysLog.getIpAddress(), sysLog.getServiceName(), sysLog.getServiceIp());

		customerUseLogPO.setLogId(UUID.randomUUID().toString().replace("-", ""));

		if (customerUseLogPO.getHandleDateTimeMillis() != null
				&& !"".equals(customerUseLogPO.getHandleDateTimeMillis())) {
			customerUseLogPO.setUseTime(new Date(Long.valueOf(customerUseLogPO.getHandleDateTimeMillis())));
		}

		if (!StringUtils.isEmpty(sysLog.getUserId())) {
			customerUseLogPO.setUserId(sysLog.getUserId());
			customerUseLogPO.setUserName(sysLog.getUserName());
		}

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user != null) {
				customerUseLogPO.setUserId(user.getUserId());
				customerUseLogPO.setUserName(user.getUserName());
		}

		LogUtil.log(SystemHandleLogInfo.LogLevel.INFO, sysLog.getModuleId(), sysLog.getBussinessName(), sysLog.getLogContent(),
				customerUseLogPO.getUserName(), sysLog.getIpAddress());

		int resultCount = sysLogService.insert(customerUseLogPO);

		return ResponseMessage2.Success2(resultCount > 0);
	}


	/** ###################登录日志分割线######################### */
	/**
	 * 根据时间用户统计日志
	 *
	 * @param start
	 * @param end
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogUsersLoginStat", method = { RequestMethod.GET })
	@ApiOperation(value = "根据用户统计登录日志")
	@ApiImplicitParams({
			@ApiImplicitParam(name = "start", value = "开始时间", required = true, paramType = "query", dataType = "String"),
			@ApiImplicitParam(name = "end", value = "结束时间", required = true, paramType = "query", dataType = "String"),
			@ApiImplicitParam(name = "pageIndex", value = "页序号", required = true, paramType = "query", dataType = "int"),
			@ApiImplicitParam(name = "pageSize", value = "页大小", required = true, paramType = "query", dataType = "int") })
	public ResponseMessage2<PageData<UserLogCountInfoPO>> getUsersLoginStat(@RequestParam("start") String start, @RequestParam("end") String end,
																			@RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user == null) {
			return ResponseMessage2.Failed("请先登录");
		}
		Page<UserLogCountInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.getUsersLoginStat(start, end);

		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 *
	 * 根据用户ID查询日志详细信息
	 *
	 * @param start
	 * @param end
	 * @param userId
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogUsersLoginDetails", method = { RequestMethod.GET })
	@ApiOperation(value = "根据用户ID查询登录日志详细信息")
	public ResponseMessage2<PageData<SysLogInfoPO>> getUsersLoginDetails(@RequestParam("start") String start,
																		 @RequestParam("end") String end,@RequestParam("userId") String userId, @RequestParam("pageIndex") Integer pageIndex,
																		 @RequestParam("pageSize") Integer pageSize) throws Exception {

		Page<SysLogInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.getUsersLoginDetails(start, end, userId);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 * 根据时间角色统计日志
	 *
	 * @param start
	 * @param end
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogRolesLoginStat", method = { RequestMethod.GET })
	@ApiOperation(value = "根据角色统计登录日志")
	public ResponseMessage2<PageData<RoleLogCountInfoPO>> getRolesLoginStat(@RequestParam("start") String start, @RequestParam("end") String end,
																			@RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user == null) {
			return ResponseMessage2.Failed("请先登录");
		}

		Page<RoleLogCountInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.getRolesLoginStat(start, end);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}

	/**
	 * 根据角色查询日志
	 *
	 * @param start
	 * @param end
	 * @param roleName
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogRolesLoginDetails", method = {  RequestMethod.GET })
	@ApiOperation(value = "根据角色查询登录日志详情")
	public ResponseMessage2<PageData<SysLogInfoPO>> getRolesLoginDetails(@RequestParam("start") String start, @RequestParam("end") String end, @RequestParam("roleName") String roleName,
																		 @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {


		Page<SysLogInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.getRolesLoginDetails(start, end,roleName);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}



	/** ###################访问日志统计分割线######################### */
	/**
	 * 根据时间用户统计日志
	 *
	 * @param start
	 * @param end
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@GetMapping(value = "/getLogVisitCountByUserDate")
	@ApiOperation(value = "根据用户统计访问日志")
	@ApiImplicitParams({
			@ApiImplicitParam(name = "start", value = "开始时间", required = true, paramType = "query", dataType = "String"),
			@ApiImplicitParam(name = "end", value = "结束时间", required = true, paramType = "query", dataType = "String"),
			@ApiImplicitParam(name = "pageIndex", value = "页序号", required = true, paramType = "query", dataType = "int"),
			@ApiImplicitParam(name = "pageSize", value = "页大小", required = true, paramType = "query", dataType = "int") })
	public ResponseMessage2<PageData<UserLogCountInfoPO>> getLogVisitCountByUserDate(@RequestParam("start") String start, @RequestParam("end") String end,
																		  @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user == null) {
			return ResponseMessage2.Failed("请先登录");
		}
		Page<UserLogCountInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.countByUserDate(start, end);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 *
	 * 根据用户ID查询日志详细信息
	 *
	 * @param start
	 * @param end
	 * @param userId
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogVisitCountByUserIdDate", method = { RequestMethod.GET })
	@ApiOperation(value = "根据用户ID查询访问日志详细信息")
	public ResponseMessage2<PageData<SysLogInfoPO>> getLogVisitCountByUserIdDate(@RequestParam("start") String start,
																			  @RequestParam("end") String end, @RequestParam("userId") String userId,
																			  @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {
		Page<SysLogInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.selectLogInfoByUserIdDate(start, end,userId);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 * 根据时间角色统计访问日志
	 *
	 * @param start
	 * @param end
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogVisitCountByRoleDate", method = {  RequestMethod.GET })
	@ApiOperation(value = "根据角色统计访问日志")
	public ResponseMessage2<PageData<RoleLogCountInfoPO>> getVisitCountByRoleDate(@RequestParam("start") String start, @RequestParam("end") String end,
																		  @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user == null) {
			return ResponseMessage2.Failed("请先登录");
		}

		Page<RoleLogCountInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.countByRoleDate(start, end);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 * 根据角色查询访问日志
	 *
	 * @param start
	 * @param end
	 * @param roleName
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogVisitDetailByRoleNameDate", method = { RequestMethod.GET })
	@ApiOperation(value = "根据角色名称查询访问日志详情")
	public ResponseMessage2<PageData<SysLogInfoPO>> getVisitDetailByRoleNameDate(@RequestParam("start") String start, @RequestParam("end") String end, @RequestParam("roleName") String roleName,
																	 @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		Page<SysLogInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.selectByRoleDate(start, end,roleName);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/** ###################模块访问日志统计分割线######################### */
	/**
	 * 根据时间模块统计日志
	 *
	 * @param start
	 * @param end
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogModuleCountByDate", method = { RequestMethod.GET })
	@ApiOperation(value = "根据模块统计日志")
	public ResponseMessage2<PageData<ModuleLogCountInfoPO>> getModuleCountByDate(@RequestParam("start") String start, @RequestParam("end") String end,
																			  @RequestParam("pageIndex") Integer pageIndex, @RequestParam("pageSize") Integer pageSize) throws Exception {

		SessionInfo user = ProcessUtil.getUserInfo();
		if (user == null) {
			return ResponseMessage2.Failed("请先登录");
		}

		Page<ModuleLogCountInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.countByModuleDate(start, end);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));
	}


	/**
	 * 根据模块ID查询日志详细信息
	 *
	 * @param start
	 * @param end
	 * @param moduleId
	 * @param pageIndex
	 * @param pageSize
	 * @return
	 * @throws Exception
	 */
	@RequestMapping(value = "/getLogModuleDetailByModuleIdDate", method = {RequestMethod.GET })
	@ApiOperation(value = "根据模块ID查询日志详细信息")
	public ResponseMessage2<PageData<SysLogInfoPO>> getModuleDetailByModuleIdDate(@RequestParam("start") String start, @RequestParam("end") String end,
																				@RequestParam("moduleId") String moduleId, @RequestParam("pageIndex") Integer pageIndex,
																				@RequestParam("pageSize") Integer pageSize) throws Exception {



		Page<SysLogInfoPO> result=PageHelper.startPage(pageIndex, pageSize);
		sysLogService.selectLogInfoByModuleIdDate(start, end,moduleId);
		return ResponseMessage2.Success2(PageData.create2(result.getTotal(), result.getResult()));

	}







}