package org.boehn.kmlframework.kml;

import java.util.List;

public class Model extends Geometry {

	private AltitudeModeEnum altitudeMode;
	private Double longitude;
	private Double latitude;
	private Double altitude;
	private Double heading;
	private Double tilt;
	private Double roll;
	private Double scaleX;
	private Double scaleY;
	private Double scaleZ;
	private Link link;
	private List<Alias> resourceMap;
	private String locationID;
	private String orientationID;
	private String scaleID;
	
	public Model() {}
	
	public Model(AltitudeModeEnum altitudeMode, Double longitude, Double latitude, Double altitude, Double heading, Double tilt, Double roll, Double scaleX, Double scaleY, Double scaleZ, Link link, List<Alias> resourceMap) {
		this.altitudeMode = altitudeMode;
		this.longitude = longitude;
		this.latitude = latitude;
		this.altitude = altitude;
		this.heading = heading;
		this.tilt = tilt;
		this.roll = roll;
		this.scaleX = scaleX;
		this.scaleY = scaleY;
		this.scaleZ = scaleZ;
		this.link = link;
		this.resourceMap = resourceMap;
	}
	
	public AltitudeModeEnum getAltitudeMode() {
		return altitudeMode;
	}

	public void setAltitudeMode(AltitudeModeEnum altitudeMode) {
		this.altitudeMode = altitudeMode;
	}

	public Double getLongitude() {
		return longitude;
	}

	public void setLongitude(Double longitude) {
		this.longitude = longitude;
	}

	public Double getLatitude() {
		return latitude;
	}

	public void setLatitude(Double latitude) {
		this.latitude = latitude;
	}

	public Double getAltitude() {
		return altitude;
	}

	public void setAltitude(Double altitude) {
		this.altitude = altitude;
	}

	public Double getHeading() {
		return heading;
	}

	public void setHeading(Double heading) {
		this.heading = heading;
	}

	public Double getTilt() {
		return tilt;
	}

	public void setTilt(Double tilt) {
		this.tilt = tilt;
	}

	public Double getRoll() {
		return roll;
	}

	public void setRoll(Double roll) {
		this.roll = roll;
	}

	public Double getScaleX() {
		return scaleX;
	}

	public void setScaleX(Double scaleX) {
		this.scaleX = scaleX;
	}

	public Double getScaleY() {
		return scaleY;
	}

	public void setScaleY(Double scaleY) {
		this.scaleY = scaleY;
	}

	public Double getScaleZ() {
		return scaleZ;
	}

	public void setScaleZ(Double scaleZ) {
		this.scaleZ = scaleZ;
	}

	public Link getLink() {
		return link;
	}

	public void setLink(Link link) {
		this.link = link;
	}

	public List<Alias> getResourceMap() {
		return resourceMap;
	}

	public void setResourceMap(List<Alias> resourceMap) {
		this.resourceMap = resourceMap;
	}

	public String getLocationID() {
		return locationID;
	}

	public void setLocationID(String id) {
		locationID=id;
	}

	public String getOrientationID() {
		return orientationID;
	}

	public void setOrientationID(String id) {
		orientationID=id;
	}

	public String getScaleID() {
		return scaleID;
	}

	public void setScaleID(String id) {
		scaleID=id;
	}

	public void write(Kml kml) throws KmlException {
		kml.println("<Model" + getIdAndTargetIdFormatted(kml) + ">", 1);
		if (altitudeMode != null) {
			kml.println("<altitudeMode>" + altitudeMode + "</altitudeMode>");
		}
		if (longitude != null || latitude != null || altitude != null) {
			kml.println("<Location"+
				(locationID==null ? "" : " id=\""+locationID+"\"")
				+">", 1);
			if (longitude != null) {				
				kml.println("<longitude>" + longitude + "</longitude>");
			}
			if (latitude != null) {				
				kml.println("<latitude>" + latitude + "</latitude>");
			}
			if (altitude != null) {
				kml.println("<altitude>" + altitude + "</altitude>");
			}
			kml.println(-1, "</Location>");
		}
		if (heading != null || tilt != null || roll != null) {
			kml.println("<Orientation"
				+(orientationID==null ? "" : " id=\""+orientationID+"\"")
				+">", 1);
			if (heading != null) {				
				kml.println("<heading>" + heading + "</heading>");
			}
			if (tilt != null) {				
				kml.println("<tilt>" + tilt + "</tilt>");
			}
			if (roll != null) {
				kml.println("<roll>" + roll + "</roll>");
			}
			kml.println(-1, "</Orientation>");
		}
		if (scaleX != null || scaleY != null || scaleZ != null) {
			kml.println("<Scale"
				+(scaleID==null ? "" : " id=\""+scaleID+"\"")
				+">", 1);
			if (scaleX != null) {				
				kml.println("<x>" + scaleX + "</x>");
			}
			if (scaleY != null) {				
				kml.println("<y>" + scaleY+ "</y>");
			}
			if (scaleZ != null) {
				kml.println("<z>" + scaleZ + "</z>");
			}
			kml.println(-1, "</Scale>");
		}
		if (link != null) {
			link.write(kml);
		}
		if (resourceMap != null) {
			kml.println("<ResourceMap>", -1);
			for (Alias alias : resourceMap) {
				alias.write(kml);
			}
			kml.println(-1, "</ResourceMap>");
		}
		kml.println(-1, "</Model>");
	}
}