package com.platform.utils;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.springframework.stereotype.Service;

import com.base.Custom4exception;
import com.base.CustomException;
import com.platform.entities.Brick;
import com.platform.entities.FolderNode;
import com.platform.entities.VolumeEntity;
import com.platform.glusterfs.ClusterInfo;
import com.platform.glusterfs.GetTreeData;
import com.platform.glusterfs.VolumeInfo;

public class ThreadVolume extends Thread implements Runnable{
	
	/**
	 * 挂载点路径 -- 暂时无用的
	 */
	private static String pointPath = "/home";
	
	/**  Volume信息查询  */
	private VolumeInfo volumeInfo = new VolumeInfo();
	
	private ClusterInfo cluster = new ClusterInfo();
	
	public ThreadVolume() {
		// TODO Auto-generated constructor stub
	}
	
	public ThreadVolume(String path) {
		if (null != path && !"".equals(path.trim())) {
			ThreadVolume.pointPath = path;
		}
	}
	
	/** gfs目录树形展示  */
	private GetTreeData gfsTree = new GetTreeData();
	
	@Override
	public void run() {
		super.run();
		while(true){
				List<FolderNode> folderlist = new ArrayList<FolderNode>();
				List<VolumeEntity> volumeList = new ArrayList<VolumeEntity>();
				// brick状态 map集合
				Map<String, String> brickStatusMap = cluster.showClusterInfo();
				
				//查询 volume name
				List<String> volumeNameList = volumeInfo.showAllVolumeName();
				if (null != volumeNameList) {
					for (String volumeName : volumeNameList) {
						try {
							VolumeEntity volume = new VolumeEntity();
							volume.setName(volumeName);
							List<String> path = volumeInfo.getVolumeMountPoint(volumeName);
							//默认加载第一个路径
							if (null != path && path.size() > 0) {
								volume.setPath(path.get(0));
							}
							volume.setAllSize(volumeInfo.getVolumeAvailableSize(volumeName));
							volume.setStatus(volumeInfo.getVolumeStatus(volumeName));
							volume.setUsedSize(volumeInfo.getVolumeUseSize(volumeName));
							volume.setType(volumeInfo.getVolumeType(volumeName));
							//TODO 查询brick--
							//返回     ip:path
							List<String> brickStrs = volumeInfo.getVolumeBricks(volumeName);
							//brick已用大小：
							Map<String, Double> usedSize = volumeInfo.getVolumebricksDataSize(volumeName);
							Map<String, Double> availableSize = volumeInfo.getVolumebricksAvailableSize(volumeName);
							
							List<Brick> brickList = new ArrayList<Brick>();
							for (String brickIpPath : brickStrs) {
								Brick b = new Brick();
								String ipAndpath[] = brickIpPath.split(":");
								String brickip = ipAndpath[0];
								String brickpath = ipAndpath[1];
								//iP ,  path ,  
								b.setIp(brickip);
								if(brickStatusMap==null || brickStatusMap.size()==0){
									b.setStatus(false);
								}else if (brickStatusMap.containsKey(brickip)) {
									b.setStatus(true);
								}
								else {
									b.setStatus(false);
								}
								b.setPath(brickpath);
								b.setAvailableSize(availableSize.get(brickIpPath));
								b.setUsedSize(usedSize.get(brickIpPath));
								brickList.add(b);
							}
							volume.setBrick(brickList);
							
							
							//默认加载第一个路径
							if (null != path && path.size() > 0) {
								//装入 folder：
								//查询 每个 volume 下的 folder
								FolderNode foldertmp = gfsTree.getDatas(path.get(0));
								folderlist.add(foldertmp);
							}
							volumeList.add(volume);
						}catch (Exception e) {
							new CustomException(Custom4exception.threadVolume_class_Except,e);
						}
					}
				}
				//TODO 更新folder 目录
				CacheTreeData.setFolders(folderlist);
				CacheTreeData.setVolumeList(volumeList);
				try {
					Thread.sleep(Constant.get_volume_sleep_time);
				} catch (InterruptedException e) {
					new CustomException(Custom4exception.threadVolume_Thread_Except,e);
				}
				
		}
		
	}

	public static String getPointPath() {
		return pointPath;
	}

	public static void setPointPath(String pointPath) {
		ThreadVolume.pointPath = pointPath;
	}
	
}
