#include "Kernel.hpp"

namespace megu::kernel {
    Kernel::Kernel(Window & window) 
    : _window(window), _pEngine(), _gEngine(window) {
        this->_pEngine.boot(*this);
        this->_gEngine.boot(*this);
    }

    Kernel::~Kernel() {
        this->_pEngine.stop(*this);
        this->_pEngine.stop(*this);
    }

    void Kernel::step() {
        double time = Window::Time();

        if(this->_window.isOpen()) {
            this->_gEngine.step(*this, time);
            this->_gResolver.resolve(*this, this->_gEngine, time);
        }

        this->_pEngine.step(*this, time);
        this->_pResolver.resolve(*this, this->_pEngine, time);
    }

    void Kernel::add(Prop * props) {
        this->_props[props->id()] = props;
        auto * pComponent = props->getPhysicComponent();
        if(pComponent != nullptr) {
            this->_pEngine.add(*this, *pComponent);
            this->_pResolver.add(*pComponent);
        }
        
        auto * gComponent = props->getGraphicComponent();
        if(gComponent != nullptr) {
            this->_gEngine.add(*this, *gComponent);
            this->_gResolver.add(*gComponent);
        }
    }
}