// 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/>.

#pragma once

#include <IAEngine/Components/CameraComponent.hpp>
#include <IAEngine/Nodes/INode.hpp>

namespace ia::iae
{
    class Scene
    {
      public:
        STATIC RefPtr<Scene> Create();
        STATIC RefPtr<Scene> Create(
            IN CONST String &sceneXML, IN std::function<RefPtr<Node2D>(IN CONST String &, IN Handle)> getCustomNode,
            IN std::function<Handle(IN ResourceType type, IN CONST String &, IN INT64)> getResource);

      public:
        VOID AddNode(IN RefPtr<INode> node);
        INode *GetNode(IN CONST String &name);
        VOID RemoveNode(IN CONST String &name);

      public:
        String &UIMarkup()
        {
            return m_uiMarkup;
        }

        String &UIMarkupStyles()
        {
            return m_uiMarkupStyles;
        }

        IVec2 &Extent()
        {
            return m_extent;
        }

        IVec2 &Viewport()
        {
            return m_viewport;
        }

        Color &BackgroundColor()
        {
            return m_backgroundColor;
        }

      private:
        String m_uiMarkup{};
        String m_uiMarkupStyles{};
        IVec2 m_extent{100, 100};
        IVec2 m_viewport{100, 100};
        CameraComponent *m_camera{};
        Color m_backgroundColor{0, 0, 0, 255};
        Map<String, RefPtr<INode>> m_nodes;

      public:
        VOID Draw();
        VOID DebugDraw();

        VOID FixedUpdate();
        VOID Update();

      private:
        VOID OnActivate();

        friend class WorldManager;
    };
} // namespace ia::iae