/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/

#include "stdafx.h"
#include "dictionary.h"

#include "simulation.h"
#include "utilities.h"
#include "DynObj.h"
#include "Driver.h"
#include "mtable.h"

dictionary_source::dictionary_source( std::string const &Input ) {

    auto const keyvaluepairs { Split( Input, '&' ) };

    for( auto const &keyvaluepair : keyvaluepairs ) {

        auto const valuepos { keyvaluepair.find( '=' ) };
        if( keyvaluepair[ 0 ] != '$' ) {
            // regular key, value pairs
            insert(
                ToLower( keyvaluepair.substr( 0, valuepos ) ),
                keyvaluepair.substr( valuepos + 1 ) );
        }
        else {
            // special case, $key indicates request to include certain dataset clarified by value
            auto const key { ToLower( keyvaluepair.substr( 0, valuepos ) ) };
            auto const value { keyvaluepair.substr( valuepos + 1 ) };

            if( key == "$timetable" ) {
                // timetable pulled from (preferably) the owner/direct controller of specified vehicle
                auto const *vehicle { simulation::Vehicles.find( value ) };
                auto const *controller { (
                    vehicle == nullptr ? nullptr :
                    vehicle->ctOwner == nullptr ? vehicle->Mechanik :
                    vehicle->ctOwner ) };
                auto const *timetable { (
                    controller != nullptr ?
                        controller->TrainTimetable() :
                        nullptr ) };

                if( timetable != nullptr ) {
                    timetable->serialize( this );
                }
            }
        }
    }
}
