package gps;

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

import anywheresoftware.b4a.BA;
import anywheresoftware.b4a.keywords.Common;
import jGPIO.mycodes;

@BA.ShortName("GpsGPGLL")
public class GpsGPGLL {
	public String invalidmsg = "";
	public double Latitude = -1;
	public double Longitude = -1;
	public byte UTC_Hour = -1;
	public byte UTC_Minute = -1;
	public byte UTC_Second = -1;
	public boolean PositionFixed = false;
	public GpsGPGLL(String msg) {
		String[] partB = msg.split(",");
		if (partB.length<7) {
			invalidmsg = "GPGLL split less than 7";
			return;
		}
		
		List<String> err = new ArrayList<String>();
		
		double[] result;
		// Latitude
		result = new double[] {0};
		if (mycodes.Gps_Latitude_formatchange(partB[1], result)) {
			Latitude = result[0];	
		} else {
			err.add("GPGLL Invalid Latitude : "+partB[1]);
		}
		
		// Latitude polarity, N or S
		switch(mycodes.Gps_Char(partB[2])) {
		case 'N' :
			Latitude = mycodes.SetPositive(Latitude);			// hasil harus positif
			break;
		case 'S' :
			Latitude = mycodes.SetNegative(Latitude);			// hasil harus negatif
			break;
		default :
			Latitude = 0;			// gak jelas
			err.add("GPGLL Invalid Latitude Polarity : "+partB[2]);
			break;
		}
		
		
		// Longitude
		result = new double[] {0};
		if (mycodes.Gps_Longitude_formatchange(partB[3], result)) {
			Longitude = result[0];
		} else {
			err.add("GPGLL Invalid Longitude : "+partB[3]);
		}

		// Longitude polarity, W or S
		switch(mycodes.Gps_Char(partB[4])) {
		case 'W' :
			Longitude = mycodes.SetNegative(Longitude);			// hasil harus negatif
			break;
		case 'E' :
			Longitude = mycodes.SetPositive(Longitude);			// hasil harus positif
			break;
		default :
			Longitude = 0;
			err.add("GPGLL Invalid Longitude Polarity : "+partB[4]);
			break;
		}
		
		// UTC Time
		byte[] utc = new byte[] {0,0,0};
		if (mycodes.Gps_UTCTime(partB[5], utc)) {
			UTC_Hour = utc[0];
			UTC_Minute = utc[1];
			UTC_Second = utc[2];
		} else {
			err.add("GPGLL dont have Time");
			
		}
		
		// Fixed Status
		switch(mycodes.Gps_Char(partB[6])) {
		case 'A' :
			PositionFixed = true;
			break;
		case 'V' :
			PositionFixed = false;
			break;
		default :
			err.add("GPGLL Invalid PositionFix : "+partB[6]);
			break;
		}
		
		invalidmsg = mycodes.Gps_ErrList_to_String(err);
		
	}
	
	public boolean isValid() {
		if (invalidmsg=="") return true; else return false;
	}
	
	/**
	 * Get UTC Time String in format hh:mm:ss
	 * @return UTC Time String in format hh:mm:ss, or empty string if invalid data
	 */
	public String UTC_Time_hhmmss() {
		if (isValid()) {
			StringBuilder str = new StringBuilder();
			str.append(Common.NumberFormat(UTC_Hour, 2, 0));
			str.append(":");
			str.append(Common.NumberFormat(UTC_Minute, 2, 0));
			str.append(":");
			str.append(Common.NumberFormat(UTC_Second,2,0));
			return str.toString();
		} else return "";
	}
}
