// IAEngine: 2D Game Engine by IA
// Copyright (C) 2025 IASoft (PVT) LTD (oss@iasoft.dev)
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program.  If not, see <https://www.gnu.org/licenses/>.

#include <IAEngine/Engine.hpp>
#include <IAEngine/Scene.hpp>

namespace ia::iae
{
    RefPtr<Scene> Scene::Create()
    {
        const auto scene = MakeRefPtr<Scene>();
        scene->Extent() = Engine::GetDisplayExtent();
        return scene;
    }

    RefPtr<Scene> Scene::Create(IN CONST String &sceneXML)
    {
        const auto scene = MakeRefPtr<Scene>();
        scene->Extent() = Engine::GetDisplayExtent();
        
        return scene;
    }

    VOID Scene::Draw()
    {
        for (auto &t : m_nodes)
            t->Value->Draw();
    }

    VOID Scene::DebugDraw()
    {
        for (auto &t : m_nodes)
            t->Value->DebugDraw();
    }

    VOID Scene::FixedUpdate()
    {
        for (auto &t : m_nodes)
            t->Value->FixedUpdate();
    }

    VOID Scene::Update()
    {
        for (auto &t : m_nodes)
            t->Value->Update();
    }

    VOID Scene::AddNode(IN RefPtr<INode> node)
    {
        m_nodes[node->GetName()] = node;
    }

    INode *Scene::GetNode(IN CONST String &name)
    {
        return m_nodes[name].get();
    }

    VOID Scene::RemoveNode(IN CONST String &name)
    {
        m_nodes[name] = nullptr;
    }
} // namespace ia::iae
