# See: http://wiki.flightgear.org/MapStructure
# Class things:
var name = 'WPT-airbus';
var parents = [canvas.SymbolLayer.Controller];
var __self__ = caller(0)[0];

canvas.SymbolLayer.Controller.add(name, __self__);
canvas.SymbolLayer.add(name, {
    parents: [canvas.MultiSymbolLayer],
    type: name, # Symbol type
    df_controller: __self__, # controller to use by default -- this one
    df_options: { # default configuration options
        fix_symbol: func(group){
            group.createChild('path')
            .moveTo(-10,0)
            .lineTo(0,-17)
            .lineTo(10,0)
            .lineTo(0,17)
            .close()
            .setStrokeLineWidth(3)
            .setColor(1,1,1)
            .setScale(1);
        },
        vor_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_vor.svg',
        airport_symbol: 'Nasal/canvas/map/Airbus/Images/airbus_airport.svg',
        ndb_symbol: func(group){
            group.createChild('path')
            .moveTo(-15,15)
            .lineTo(0,-15)
            .lineTo(15,15)
            .close()
            .setStrokeLineWidth(3)
            #.setColor(0.69,0,0.39)
            #.setTranslation(-24, -24),
            .setScale(1,1);
        }
    },
    df_style: {
        active_wp_color: [0.4,0.7,0.4],
        current_wp_color: [1,1,1],
        translation: {
            'airport': [-24,-24],
            'vor': [-24,-24]
        }
    },
    toggle_cstr: 0
});

var new = func(layer) {
    var m = {
        parents: [__self__],
        layer: layer,
        map: layer.map,
        listeners: [],
    };
    layer.searcher._equals = func(a,b) a.equals(b);
    var driver = opt_member(m.layer.options, 'route_driver');
    if(driver == nil){
        driver = RouteDriver.new();
    }
    var driver_listeners = driver.getListeners();
    foreach(var listener; driver_listeners){
        append(m.listeners, setlistener(listener, func m.layer.update()));
    }
    m.route_driver = driver;
    return m;
};

var del = func() {
    foreach (var l; me.listeners)
        removelistener(l);
};

var WPTModel = {
    new: func(fp, idx) {
        var m = { parents:[WPTModel] };
        var wp = fp.getWP(idx);

        m.id = wp.id;
        m.name = wp.wp_name;
        m.alt = wp.alt_cstr;
        m.spd = wp.speed_cstr;
        m.type = wp.wp_type;

        (m.lat,m.lon) = (wp.wp_lat,wp.wp_lon);
        var is_rwy = (m.type == 'runway');
        var id_len = size(m.id);
        if(!is_rwy and id_len < 5){
            if(id_len == 4 and airportinfo(m.id) != nil)
                m.navtype = 'airport';
            else {
                var navaid = nil;
                foreach(var t; ['vor', 'ndb']){
                    navaid = navinfo(m.lat, m.lon, t, m.id);
                    if(navaid != nil and size(navaid)){
                        m.navtype = t;
                        break;
                    }
                }
                if(navaid == nil or !size(navaid)) m.navtype = 'fix';
            }
        } else {
            m.navtype = (is_rwy ? 'rwy' : 'fix');
        }
        
        m.wp = wp;
        idx = wp.index;
        m.idx = idx;
        m.is_departure = (idx == 0 and is_rwy);
        m.is_destination = (idx > 0 and is_rwy);
        return m;
    },
    equals: func(other) {
        # this is set on symbol init, so use this for equality...
        me.name == other.name and me.alt == other.alt and
        me.type == other.type and me.idx == other.idx and 
        me.navtype == other.navtype
    },
};

var searchCmd = func {
    var driver = me.route_driver;
    if(!driver.shouldUpdate()) return [];
    driver.update();
    var result = [];
    var planCount = driver.getNumberOfFlightPlans();
    for(var idx = 0; idx < planCount; idx += 1){
        var fp = driver.getFlightPlan(idx);
        if(fp == nil) continue;
        var fpSize = fp.getPlanSize(idx);
        for (var i = 0; i < fpSize; i+=1){
            if(!driver.shouldUpdate()) return[];
            append(result, WPTModel.new(fp, i));
        }
    }
    return result;
}