/*
 * Copyright 1999-2018 Alibaba Group Holding Ltd.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.alibaba.csp.sentinel.dashboard.domain.vo;

import com.alibaba.csp.sentinel.dashboard.datasource.entity.MetricEntity;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;

/**
 * @author leyou
 */
public class MetricVo implements Comparable<MetricVo> {

	private Long id;

	private String app;

	private Long timestamp;

	private Long gmtCreate = System.currentTimeMillis();

	private String resource;

	private Long passQps;

	private Long blockQps;

	private Long successQps;

	private Long exceptionQps;

	/**
	 * average rt
	 */
	private Double rt;

	private Integer count;

	public MetricVo() {
	}

	public static List<MetricVo> fromMetricEntities(Collection<MetricEntity> entities) {
		List<MetricVo> list = new ArrayList<>();
		if (entities != null) {
			for (MetricEntity entity : entities) {
				list.add(fromMetricEntity(entity));
			}
		}
		return list;
	}

	/**
	 * 保留资源名为identity的结果。
	 * @param entities 通过hashCode查找到的MetricEntities
	 * @param identity 真正需要查找的资源名
	 * @return
	 */
	public static List<MetricVo> fromMetricEntities(Collection<MetricEntity> entities, String identity) {
		List<MetricVo> list = new ArrayList<>();
		if (entities != null) {
			for (MetricEntity entity : entities) {
				if (entity.getResource().equals(identity)) {
					list.add(fromMetricEntity(entity));
				}
			}
		}
		return list;
	}

	public static MetricVo fromMetricEntity(MetricEntity entity) {
		MetricVo vo = new MetricVo();
		vo.id = entity.getId();
		vo.app = entity.getApp();
		vo.timestamp = entity.getTimestamp().getTime();
		vo.gmtCreate = entity.getGmtCreate().getTime();
		vo.resource = entity.getResource();
		vo.passQps = entity.getPassQps();
		vo.blockQps = entity.getBlockQps();
		vo.successQps = entity.getSuccessQps();
		vo.exceptionQps = entity.getExceptionQps();
		if (entity.getSuccessQps() != 0) {
			vo.rt = entity.getRt() / entity.getSuccessQps();
		}
		else {
			vo.rt = 0D;
		}
		vo.count = entity.getCount();
		return vo;
	}

	public static MetricVo parse(String line) {
		String[] strs = line.split("\\|");
		long timestamp = Long.parseLong(strs[0]);
		String identity = strs[1];
		long passQps = Long.parseLong(strs[2]);
		long blockQps = Long.parseLong(strs[3]);
		long exception = Long.parseLong(strs[4]);
		double rt = Double.parseDouble(strs[5]);
		long successQps = Long.parseLong(strs[6]);
		MetricVo vo = new MetricVo();
		vo.timestamp = timestamp;
		vo.resource = identity;
		vo.passQps = passQps;
		vo.blockQps = blockQps;
		vo.successQps = successQps;
		vo.exceptionQps = exception;
		vo.rt = rt;
		vo.count = 1;
		return vo;
	}

	public Long getId() {
		return id;
	}

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

	public String getApp() {
		return app;
	}

	public void setApp(String app) {
		this.app = app;
	}

	public Long getTimestamp() {
		return timestamp;
	}

	public void setTimestamp(Long timestamp) {
		this.timestamp = timestamp;
	}

	public Long getGmtCreate() {
		return gmtCreate;
	}

	public void setGmtCreate(Long gmtCreate) {
		this.gmtCreate = gmtCreate;
	}

	public String getResource() {
		return resource;
	}

	public void setResource(String resource) {
		this.resource = resource;
	}

	public Long getPassQps() {
		return passQps;
	}

	public void setPassQps(Long passQps) {
		this.passQps = passQps;
	}

	public Long getBlockQps() {
		return blockQps;
	}

	public void setBlockQps(Long blockQps) {
		this.blockQps = blockQps;
	}

	public Long getSuccessQps() {
		return successQps;
	}

	public void setSuccessQps(Long successQps) {
		this.successQps = successQps;
	}

	public Long getExceptionQps() {
		return exceptionQps;
	}

	public void setExceptionQps(Long exceptionQps) {
		this.exceptionQps = exceptionQps;
	}

	public Double getRt() {
		return rt;
	}

	public void setRt(Double rt) {
		this.rt = rt;
	}

	public Integer getCount() {
		return count;
	}

	public void setCount(Integer count) {
		this.count = count;
	}

	@Override
	public int compareTo(MetricVo o) {
		return Long.compare(this.timestamp, o.timestamp);
	}

}
