# (C) Copyright 2005- 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";
constant true="true" :hidden;
constant false="false" : hidden;
#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 "metar/cccc.def";
} else {
        if (g is "METAR") {
                rename(g,metarTwice);
                group g : dump; non_alpha na;
                if (length(g) == 4) { include "metar/cccc.def"; }
                else {
                    constant CCCC = "unknown";
                    constant coordinatesPresent = 0;
                }
        } else {
            constant CCCC = "unknown";
            constant coordinatesPresent = 0;
        }
}

alias ls.CCCC=CCCC;
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;
    meta dateTime  sprintf("%s-%s-%s %s:%s",year,month,day,hour,minute);
    alias ls.dateTime=dateTime;
}


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

include "metar/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 "metar/wind.def";
        include "metar/horizontalVisibility.def";

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

        include "metar/missing_field.def";
        include "metar/temperature.def";

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

}

include "metar/remark.def";

if (length(g) == 0) {
        modify g : hidden;
} else {
        if ( ! remarkPresent) {
                rename(g,skippedGroup);
                group g : dump; non_alpha na;
                include "metar/colour.def";
                include "metar/recent_weather.def";
                include "metar/wind_shear.def";
                include "metar/sea_state.def";
                template runwayState "metar/runwayState.def";
                include "metar/temperature.def";
                include "metar/qnh.def";
                if (!presentTrend1) {
                        include "metar/trend1.def";
                        include "metar/trend2.def";
                        include "metar/trend3.def";
                        include "metar/trend4.def";
                }
        }
        include "metar/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;

# Added here for testing
_debug = getenv("ECCODES_DEBUG","0") : hidden;
if (_debug) {
  print "Testing: [identifier=]";
  assert( totalLength > 0 );
}
