#include "locationcontroller.h"
#include "location.h"
#include "validator.h"
#include "actor.h"

LocationController::LocationController(Initializer &&initializer) :
    Controller(std::move(initializer))
{}

LocationController::~LocationController()
{}

std::string LocationController::interact(std::shared_ptr<Actor> actor)
{
    std::string interaction_output;

    const auto validation_result = _validator
                                 ? _validator->validate(actor)
                                 : Validator::ValidateResult{true, ""};

    interaction_output += validation_result.validate_output;

    if (validation_result.success)
    {
        actor->moveToLocation(_location);

        const std::string& node_interact_message = _location->interact();
        interaction_output += (_interaction_message + "\n\n" + node_interact_message);
    }

    runModificators();

    return interaction_output;
}

void LocationController::setDependentLocation(const std::shared_ptr<Location> &location)
{
    _location = location;
}