package com.zc.business.domain;

import com.fasterxml.jackson.annotation.JsonFormat;
import com.ruoyi.common.annotation.Excel;
import com.ruoyi.common.utils.DateUtils;
import com.zc.business.enums.NetworkQuality;
import com.zc.business.enums.UniversalEnum;
import com.zc.business.utils.MathUtil;
import org.springframework.format.annotation.DateTimeFormat;

import java.io.Serializable;
import java.time.LocalDateTime;
import java.util.Arrays;
import java.util.Date;

public class OnlineLog implements Serializable {
    private static final long serialVersionUID = 1L;
    private long id;
    private Long deviceId;
    private String deviceIp;
    private String deviceName;
    private String stakeMark;
    private String direction;//方向
    private String deviceType;//设备类型
    private String deviceStatus;
    private String networkQuality;//网络质量
    private int sendCount;//发送数
    private int receiveCount;//返回数
    private int lossCount;//丢包数
    private double lossRate;//丢包率
    private double rttAvg;//平均往返时延
    private double onlineRate;//在线率
    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
    private LocalDateTime monitorTime;

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public Long getDeviceId() {
        return deviceId;
    }

    public void setDeviceId(Long deviceId) {
        this.deviceId = deviceId;
    }

    public String getDeviceIp() {
        return deviceIp;
    }

    public void setDeviceIp(String deviceIp) {
        this.deviceIp = deviceIp;
    }

    public String getDeviceName() {
        return deviceName;
    }

    public void setDeviceName(String deviceName) {
        this.deviceName = deviceName;
    }

    public String getStakeMark() {
        return stakeMark;
    }

    public void setStakeMark(String stakeMark) {
        this.stakeMark = stakeMark;
    }

    public String getDeviceStatus() {
        return deviceStatus;
    }

    public void setDeviceStatus(String deviceStatus) {
        this.deviceStatus = deviceStatus;
    }

    public String getNetworkQuality() {
        return networkQuality;
    }

    public void setNetworkQuality(String networkQuality) {
        this.networkQuality = networkQuality;
    }

    public int getSendCount() {
        return sendCount;
    }

    public void setSendCount(int sendCount) {
        this.sendCount = sendCount;
    }

    public int getReceiveCount() {
        return receiveCount;
    }

    public void setReceiveCount(int receiveCount) {
        this.receiveCount = receiveCount;
    }

    public int getLossCount() {
        return lossCount;
    }

    public void setLossCount(int lossCount) {
        this.lossCount = lossCount;
    }

    public double getLossRate() {
        return lossRate;
    }

    public void setLossRate(double lossRate) {
        this.lossRate = lossRate;
    }

    public double getRttAvg() {
        return rttAvg;
    }

    public void setRttAvg(double rttAvg) {
        this.rttAvg = rttAvg;
    }

    public LocalDateTime getMonitorTime() {
        return monitorTime;
    }

    public void setMonitorTime(LocalDateTime monitorTime) {
        this.monitorTime = monitorTime;
    }

    public String getDirection() {
        return direction;
    }

    public void setDirection(String direction) {
        this.direction = direction;
    }

    public String getDeviceType() {
        return deviceType;
    }

    public void setDeviceType(String deviceType) {
        this.deviceType = deviceType;
    }

    public double getOnlineRate() {
        return onlineRate;
    }

    public void setOnlineRate(double onlineRate) {
        this.onlineRate = onlineRate;
    }

    @Override
    public String toString() {
        return "OnlineLog{" +
                "id=" + id +
                ", deviceId=" + deviceId +
                ", deviceIp='" + deviceIp + '\'' +
                ", deviceName='" + deviceName + '\'' +
                ", stakeMark='" + stakeMark + '\'' +
                ", direction='" + direction + '\'' +
                ", deviceType='" + deviceType + '\'' +
                ", deviceStatus='" + deviceStatus + '\'' +
                ", networkQuality='" + networkQuality + '\'' +
                ", sendCount=" + sendCount +
                ", receiveCount=" + receiveCount +
                ", lossCount=" + lossCount +
                ", lossRate='" + lossRate + '\'' +
                ", rttAvg=" + rttAvg +
                ", monitorTime=" + monitorTime +
                ", onlineRate=" + onlineRate +
                '}';
    }

    public static class LogBuilder{
        OnlineLog onlineLog = new OnlineLog();
        public LogBuilder setDeviceStatus(String deviceStatus) {
            onlineLog.setDeviceStatus(deviceStatus);
            return this;
        }
        public LogBuilder setSendCount(int sendCount) {
            onlineLog.setSendCount(sendCount);
            return this;
        }
        public LogBuilder setReceiveCount(int receiveCount) {
            onlineLog.setReceiveCount(receiveCount);
            return this;
        }
        public LogBuilder setRttAvg(double rttAvg) {
            onlineLog.setRttAvg(rttAvg);
            return this;
        }
        public OnlineLog build(DcDevice device) {
            onlineLog.setDeviceId(device.getId());
            onlineLog.setDeviceIp(device.getDeviceIp());
            onlineLog.setDeviceName(device.getDeviceName());
            onlineLog.setDirection(device.getDirection());
            onlineLog.setDeviceType(device.getDeviceType());
            onlineLog.setStakeMark(device.getStakeMark());
            onlineLog.setLossCount(onlineLog.getSendCount() - onlineLog.getReceiveCount());
            double lossRate = onlineLog.getSendCount()==0?0:(double) onlineLog.getLossCount() / onlineLog.getSendCount() * 100;
            onlineLog.setLossRate(lossRate);
            onlineLog.setNetworkQuality(NetworkQuality.ofNetworkQuality(onlineLog.getLossRate(),onlineLog.getRttAvg()));
            onlineLog.setMonitorTime(LocalDateTime.now());
            onlineLog.setOnlineRate(onlineLog.getReceiveCount()==0?MathUtil.doubleTwoDecimal(0):MathUtil.doubleTwoDecimal(100));
            return onlineLog;
        }
        public OnlineLog buildBad(DcDevice device){
            onlineLog.setDeviceId(device.getId());
            onlineLog.setDeviceIp(device.getDeviceIp());
            onlineLog.setDeviceName(device.getDeviceName());
            onlineLog.setStakeMark(device.getStakeMark());
            onlineLog.setDirection(device.getDirection());
            onlineLog.setDeviceType(device.getDeviceType());
            onlineLog.setNetworkQuality(NetworkQuality.BAD.getValue());
            onlineLog.setMonitorTime(LocalDateTime.now());
            onlineLog.setSendCount(10);
            onlineLog.setReceiveCount(0);
            onlineLog.setLossCount(10);
            onlineLog.setLossRate(MathUtil.doubleTwoDecimal(100));
            onlineLog.setRttAvg(0);
            onlineLog.setDeviceStatus(UniversalEnum.ZERO.getValue());
            onlineLog.setOnlineRate(MathUtil.doubleTwoDecimal(0));
            return onlineLog;
        }
        public OnlineLog buildGood(DcDevice device){
            onlineLog.setDeviceId(device.getId());
            onlineLog.setDeviceIp(device.getDeviceIp());
            onlineLog.setDeviceName(device.getDeviceName());
            onlineLog.setStakeMark(device.getStakeMark());
            onlineLog.setDirection(device.getDirection());
            onlineLog.setDeviceType(device.getDeviceType());
            onlineLog.setNetworkQuality(NetworkQuality.GOOD.getValue());
            onlineLog.setMonitorTime(LocalDateTime.now());
            onlineLog.setSendCount(10);
            onlineLog.setReceiveCount(10);
            onlineLog.setLossCount(0);
            onlineLog.setLossRate(MathUtil.doubleTwoDecimal(0));
            onlineLog.setRttAvg(30);
            onlineLog.setDeviceStatus(UniversalEnum.ONE.getValue());
            onlineLog.setOnlineRate(MathUtil.doubleTwoDecimal(100));//在线率
            return onlineLog;
        }
    }
}