/*******************************************************************************
 * Copyright (c) 2005, 2014 springside.github.io
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 *******************************************************************************/

package com.cesgroup.cesmonitor.ws;

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

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.cesgroup.cesmonitor.bean.DiskUsageInfo;
import com.cesgroup.cesmonitor.bean.InterfaceInfo;
import com.cesgroup.cesmonitor.bean.OneHostBaseInfo;
import com.cesgroup.cesmonitor.bean.OneHostDetailInfo;
import com.cesgroup.cesmonitor.bean.OneHostUsedRateInfo;
import com.cesgroup.cesmonitor.bean.ResourceAlarmInfo;
import com.cesgroup.cesmonitor.bean.TopologicalInfo;
import com.cesgroup.cesmonitor.bean.WebMonitorStatus;
import com.cesgroup.cesmonitor.service.IdentityService;
import com.cesgroup.cesmonitor.service.OverviewService;
import com.zabbix4j.hostgroup.HostgroupGetResponse;

/**
 * 监控概览服务控制器
 *
 * @author zhang.erwei
 * @version 1.0.0 2017年5月24日
 */
@Controller
@RequestMapping(value = "/ws/overview")
public class OverviewServiceController {

    @Autowired
    OverviewService overviewService;

    @Autowired
    protected IdentityService identityService;

    /**
     * 根据主机ID获取当前主机的详细信息
     *
     * @param hostId
     *            主机的hostId
     *
     * @return 返回主机的详细信息（主机状态 :{status}、IP地址 :{ip}、操作系统: {os}、主机名称:
     *         {name}、描述:{description}、启动时间:{startTime}、持续时间:{duration}）
     */
    @RequestMapping(value = "oneHostDetailInfo")
    @ResponseBody
    public OneHostDetailInfo oneHostDetailInfo(Long hostId) {
        return overviewService.oneHostDetailInfo(hostId);
    }

    /**
     * 主机组及主机接口
     *
     * @return 返回主机组
     */
    @RequestMapping(value = "listHostGroupsWithHosts")
    @ResponseBody
    public List<HostgroupGetResponse.Result> listHostGroupsWithHosts() {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.listHostGroupsWithHosts();
    }

    /**
     * 根据主机ID获取当前主机的CPU使用率和内存使用率
     *
     * @param hostId
     *            主机的hostId
     *
     * @return 反馈主机使用率信息（CPU使用率:{cpuRate} 、内存使用率:{memoryRate}）
     */
    @RequestMapping(value = "oneHostUsedRateInfo")
    @ResponseBody
    public OneHostUsedRateInfo oneHostUsedRateInfo(Long hostId) {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.oneHostUsedRateInfo(hostId);
    }

    /**
     * 平均响应时间、丢包率接口
     *
     * @param hostId
     *            主机的hostId
     *
     * @return 返回主机的基本信息（响应时间:{responseTime}、丢包率:{packetLossRate}）
     */
    @RequestMapping(value = "oneHostBaseInfo")
    @ResponseBody
    public OneHostBaseInfo oneHostBaseInfo(Long hostId) {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.oneHostBaseInfo(hostId);
    }

    /**
     * WEB监控状态接口
     *
     * @param hostId
     *            主机的hostId
     * @return 返回web监控状态的信息（名称：{name}、监测步骤：{stepNo}、最近检察时间：{recentTime}、状态：{status}）
     */
    @RequestMapping(value = "listHostWebMonitorInfo")
    @ResponseBody
    public List<WebMonitorStatus> listHostWebMonitorInfo(Long hostId) {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.listHostWebMonitorInfo(hostId);
    }

    /**
     * 资源报警信息接口
     *
     * @param hostId
     *            主机的hostId
     * @return 返回资源报警信息(主机：{host}、问题描述：{description}、
     *         上次修改于：{startClock}、历时：{subClock}、 信息：{messages}、
     *         确认：{acknowledged}、 动作 ：{action}、 状态：{status})
     */
    @RequestMapping(value = "listHostResourceAlarmInfo")
    @ResponseBody
    public Map<Integer, ResourceAlarmInfo> listHostResourceAlarmInfo(Long hostId) {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.listHostResourceAlarmInfo(hostId);
    }

    /**
     * S1服务器接口
     */
    @RequestMapping(value = "listFaultWarningDto")
    @ResponseBody
    public void listFaultWarningDto(Date startTime, Date endTime) {
        IdentifyServiceController.checkLogin(identityService);
        overviewService.listsResourceAlarmInfo(startTime, endTime);
    }

    /**
     * 磁盘使用量接口
     *
     * @param hostId
     *            主机的hostId
     * @return 返回主机的磁盘使用信息（盘符：{driveLetter}、总容量：{totalCapacity}、使用量：{usedCapacity}、空闲率：{freeRate}）
     */
    @RequestMapping(value = "listHostsDiskUsageInfo")
    @ResponseBody
    public Map<Integer, DiskUsageInfo> listHostsDiskUsageInfo(Long hostId) {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.listHostsDiskUsageInfo(hostId);
    }

    /**
     * 网络接口信息接口
     *
     * @param hostId
     *            主机的hostId
     * @return 返回接口信息(状态:{status}、名称:{interfaceName}、进口流程：{inputFlow}、出口流程：{outputFlow}、状态变更时间：{statusChangedTime})
     */
    @RequestMapping(value = "listHostInterfaceInfo")
    @ResponseBody
    public Map<Integer, InterfaceInfo> listHostInterfaceInfo(Long hostId) {
    	long startTime = System.currentTimeMillis();    //获取开始时间
        IdentifyServiceController.checkLogin(identityService);
        long endTime = System.currentTimeMillis();    //获取结束时间
        Map<Integer, InterfaceInfo> InterfaceInfoMap = overviewService.listHostInterfaceInfo(hostId);
        System.out.println("网络接口信息接口listHostInterfaceInfo程序运行时间：" + (endTime - startTime) + "ms");    //输出程序运行时
        return InterfaceInfoMap;

    }

    /**
     * 查询拓扑图信息接口
     *
     * @return 返回拓补图信息（拓扑图名字：{sysmapName}、拓扑图ID：{sysmapId}）
     */
    @RequestMapping(value = "listTopologicalInfo")
    @ResponseBody
    public List<TopologicalInfo> listTopologicalInfo() {
        IdentifyServiceController.checkLogin(identityService);
        return overviewService.listTopologicalInfo();
    }

}
