# Copyright 2005-2017 ECMWF.
#
# This software is licensed under the terms of the Apache Licence Version 2.0
# which can be obtained at http://www.apache.org/licenses/LICENSE-2.0.
#
# In applying this licence, ECMWF does not waive the privileges and immunities granted to it by
# virtue of its status as an intergovernmental organisation nor does it submit to any jurisdiction.
#

constant normal="NORMAL";
constant correction="CORRECTION";
#meta out sprintf("metar_%s.xml",count);

alias temperatureAndDewpointPresent=zero;
alias qnhPresent=zero;
alias qnhAPresent=zero;
alias qfePresent=zero;
alias status=normal;
alias isCorrection=zero;
alias presentTrend1=zero;
alias presentTrend2=zero;
alias presentTrend3=zero;
alias isAuto=false;
alias windPresent=zero;
alias nosigPresent=zero;

position startOfMessage;
message_copy theMessage :dump ;

group identifier; non_alpha na;

group g : dump; non_alpha na;

if ( g is "COR" ) {
		rename(g,cor);
		alias isCorrection=one;
		alias status=correction;
		group g : dump; non_alpha na;
}  
if (length(g) == 4) {
		include "taf/cccc.def";
} else {
		if (g is "METAR") {
				rename(g,metarTwice);
				group g : dump; non_alpha na;
				if (length(g) == 4) { include "taf/cccc.def"; }
				else { 
						constant CCCC = "unknown"; 
						constant coordinatesPresent = 0; 
				}
		} else {
				constant CCCC = "unknown"; 
				constant coordinatesPresent = 0; 
		}
}

if (substr(g,6,1) is "Z" && is_integer(g,0,6) ) {
		rename(g,YYGGgg);
		modify YYGGgg : hidden;
		group g : dump ; non_alpha na;
		year=getenv("METAR_YEAR") : dump;
		month=getenv("METAR_MONTH") : dump;
		day = to_string(YYGGgg,0,2) : dump;
		hour = to_string(YYGGgg,2,2) : dump;
		minute = to_string(YYGGgg,4,2) : dump;
}

if ( ! isCorrection && g is "COR" ) {
		rename(g,cor);
		alias status=correction;
		alias isCorrection=one;
		group g : dump; non_alpha na;
}  

include "taf/wrong_delayed.def";

if ( g is "NIL" ) { 
		rename(g,nil); group g : dump;
} else {
		if (g is "AUTO") { 
				rename(g,auto); 
				alias isAuto=true; 
				group g : dump; non_alpha na; 
		}

		include "taf/wind.def";
		include "taf/horizontalVisibility.def";

		if ( ! isCavok ) { 
				include "taf/present_weather.def";
				include "taf/clouds.def";
		}

		include "taf/missing_field.def";
		include "taf/temperature.def";
		include "taf/qnh.def";
		include "taf/colour.def";
		include "taf/recent_weather.def";
		include "taf/wind_shear.def";
		include "taf/sea_state.def";
		template runwayState "metar/runwayState.def";
		include "taf/trend1.def";
		include "taf/trend2.def";
		include "taf/trend3.def";
		include "taf/trend4.def";

}

include "taf/remark.def";

if (length(g) == 0) { 
		modify g : hidden;
} else {
		if ( ! remarkPresent) { 
				rename(g,skippedGroup);
				group g : dump; non_alpha na;
				include "taf/colour.def";
				include "taf/recent_weather.def";
				include "taf/wind_shear.def";
				include "taf/sea_state.def";
				template runwayState "metar/runwayState.def";
				include "taf/temperature.def";
				include "taf/qnh.def";
				if (!presentTrend1) {
						include "taf/trend1.def";
						include "taf/trend2.def";
						include "taf/trend3.def";
						include "taf/trend4.def";
				}
		}
		include "taf/remark.def";
		if ( ! remarkPresent) { 
				if ( length(g) == 0) {
						modify g : hidden;
				} else {
						rename(g,unknownGroup) ; 
				}
		}
		group notDecoded("=") : dump;
		if (remarkPresent) { 
				rename(notDecoded,remark); 
		}
}
ascii[1] endMark :read_only ;

position totalLength; 
position endOfMessage;

meta lengthOfMessage evaluate( endOfMessage-startOfMessage);
meta md5Headers md5(startOfMessage,lengthOfMessage);

alias ls.totalLength=totalLength;


