/*******************************************************************************
 * Copyright (c) 2010 Robert "Unlogic" Olofsson (unlogic@unlogic.se).
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the GNU Lesser Public License v3
 * which accompanies this distribution, and is available at
 * http://www.gnu.org/licenses/lgpl-3.0-standalone.html
 ******************************************************************************/
package se.unlogic.standardutils.hddtemp;

import se.unlogic.standardutils.net.SocketUtils;
import se.unlogic.standardutils.numbers.NumberUtils;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.Socket;
import java.net.SocketTimeoutException;
import java.util.ArrayList;

public class HDDTempUtils {

	private static final String delims = "[|]+";

	public static ArrayList<Drive> getHddTemp(String host, int port, int timeout) throws IOException {

		Socket socket = null;

		try {
			socket = SocketUtils.getSocket(host, port, timeout);

			BufferedReader bfrRd = new BufferedReader(new InputStreamReader(socket.getInputStream()));

			int waitCount = 0;
			
			while(!bfrRd.ready()){
				
				if(waitCount >= timeout){
					
					throw new SocketTimeoutException("No HDD temp response received");
				}
				
				try {
					waitCount += 200;
					Thread.sleep(200);
				} catch (InterruptedException e) {}
			}
			
			String response = new String(bfrRd.readLine());

			String[] tokens = response.split(delims);

			if((tokens.length - 1) % 4 != 0){
				
				throw new IOException("Invalid data received: " + response);
			}
			
			ArrayList<Drive> drives = new ArrayList<Drive>();
			
			for (int i = 1; i < tokens.length; i = i + 4) {
				
				Drive drive = new Drive();
				
				drive.setDevice(tokens[i]);
				drive.setType(tokens[i+1]);
				drive.setTemp(NumberUtils.toInt(tokens[i+2]));
				
				if(drive.getTemp() != null){
					
					drive.setDriveState(DriveState.OK);
					
				}else if(tokens[i+2].equals("SLP")){
					
					drive.setDriveState(DriveState.SLEEPING);
					
				}else if(tokens[i+2].equals("ERR")){
					
					drive.setDriveState(DriveState.ERROR);
				
				}else{
					
					drive.setDriveState(DriveState.UNKNOWN);
				}
				
				drives.add(drive);
			}
			
			return drives;

		} finally {

			if (socket != null) {
				socket.close();
			}
		}
	}
}
