
#include "loop.hpp"

using namespace Sim::Coolant;


Loop::Loop(Reactor::Coolant::Vessel* vessel, Evaporator* evaporator, Electric::Grid* grid) :
		condenser(WATER, 6, 4, 3e6, 30000),
		turbine(&condenser),
		generator(&turbine, grid, 6, 3, 2e6),
		condenser_secondary(&condenser, evaporator),
		turbine_inlet_valve(vessel, &turbine, 0, 0.5),
		turbine_bypass_valve(vessel, &condenser, 0, 0.5),
		primary_pump(&condenser, vessel, 1e5, 1, 1e5, 0.1, 10, Pump::mode_t::SRC, 35000),
		secondary_pump(evaporator, &condenser_secondary, 1e5, 1, 1e4, 0.1, 1, Pump::mode_t::NONE, 0)
{

}

Loop::Loop(const Json::Value& node, Reactor::Coolant::Vessel* vessel, Evaporator* evaporator, Electric::Grid* grid) :
		condenser(node["condenser"]),
		turbine(&condenser),
		generator(node["generator"], &turbine, grid),
		condenser_secondary(&condenser, evaporator),
		turbine_inlet_valve(node["valve"]["inlet"], vessel, &turbine),
		turbine_bypass_valve(node["valve"]["bypass"], vessel, &condenser),
		primary_pump(node["pump"]["primary"], &condenser, vessel),
		secondary_pump(node["pump"]["secondary"], evaporator, &condenser_secondary)
{

}

void Loop::update(double dt)
{
	turbine_inlet_valve.update(dt);
	turbine_bypass_valve.update(dt);
	condenser.update(dt);

	turbine.update(dt);
	generator.update(dt);

	primary_pump.update(dt);
	secondary_pump.update(dt);
	condenser_secondary.update(dt);
}

Loop::operator Json::Value() const
{
	Json::Value node;
	
	node["generator"] = generator;
	node["condenser"] = condenser;
	node["pump"]["primary"] = primary_pump;
	node["pump"]["secondary"] = secondary_pump;
	node["valve"]["inlet"] = turbine_inlet_valve;
	node["valve"]["bypass"] = turbine_bypass_valve;

	return node;
}

