# DO228 ND Canvas
# Benedikt Wolf
# based on work by Joshua Davidson and artix

var DO228RouteDriver = {
    new: func(){
        var m = {
            parents: [DO228RouteDriver],
        };
        m.init();
        return m;
    },
    init: func(){
        me.update();
    },
    update: func(){
        me.flightplan = flightplan();
    },
    getNumberOfFlightPlans: func(){1},
    getFlightPlanType: func(fpNum){"current"},
    getFlightPlan: func(fpNum){me.flightplan},
    getPlanSize: func(fpNum){me.flightplan.getPlanSize()},
    getWP: func(fpNum, idx){me.flightplan.getWP(idx)},
    getPlanModeWP: func(plan_wp_idx){me.flightplan.getWP(plan_wp_idx)},
    hasDiscontinuity: func(fpNum, wptID){0},
    getListeners: func(){[]},
    shouldUpdate: func 1
};

var MultiDO228RouteDriver = {
    parents: [DO228RouteDriver],
    new: func(){
        var m = {
            parents: [MultiDO228RouteDriver],
            _flightplans: [],
            currentFlightPlan: 0
        };
        m.init();
        return m;
    },
    addFlightPlan: func(type, plan){
        append(me._flightplans, {
            type: type,
            flightplan: plan
        });
    },
    removeFlightPlanAtIndex: func(idx){
        var sz = size(me._flightplans);
        if(idx < sz){
            if(sz == 1)
                me._flightplans = [];
            elsif(sz == 2 and idx == 0)
                me._flightplans = [me._flightplans[1]];
            elsif(sz == 2 and idx == 1)
                pop(me._flightplans);
            else {
                var subv_l = subvec(me._flightplans, 0, idx);
                var subv_r = subvec(me._flightplans, idx + 1);
                me._flightplans = subv_l ~ subv_r;
            }
        }
        me.triggerSignal("fp-added");
    },
    removeFlightPlanOfType: func(type){
        var new_vec = [];
        foreach(var fp; me._flightplans){
            if(fp["type"] != type)
                append(new_vec, fp);
        }
        me._flightplans = new_vec;
        me.triggerSignal("fp-removed");
    },
    getNumberOfFlightPlans: func(){
        size(me._flightplans);
    },
    getFlightPlanType: func(fpNum){
        if(fpNum >= size(me._flightplans)) return nil;
        var fp = me._flightplans[fpNum];
        return fp.type;
    },
    getFlightPlan: func(fpNum){
        if(fpNum >= size(me._flightplans)) return nil;
        return me._flightplans[fpNum];
    },
    getPlanSize: func(fpNum){
        if(fpNum >= size(me._flightplans)) return 0;
        return me._flightplans[fpNum].getPlanSize();
    },
    getWP: func(fpNum, idx){
        if(fpNum >= size(me._flightplans)) return nil;
        var fp = me._flightplans[fpNum].getPlanSize();
        return fp.getWP(idx);
    },
    getPlanModeWP: func(idx){
        if(me.currentFlightPlan >= size(me._flightplans)) return nil;
        var fp = me._flightplans[me.currentFlightPlan];
        return fp.getWP(idx);
    },
    triggerSignal: func(signal){
        setprop(me.signalPath(signal));
    },
    signalPath: func(signal){
        "autopilot/route-manager/signals/rd-"~ signal;
    },
    getListeners: func(){[
        me.getSignal("fp-added"),
        me.getSignal("fp-removed")
    ]}
};
