/*
 * Copyright (c) 2026, Aliaksandr Kalenik <kalenik.aliaksandr@gmail.com>
 *
 * SPDX-License-Identifier: BSD-2-Clause
 */

#pragma once

#include <AK/Forward.h>
#include <AK/HashMap.h>
#include <AK/Noncopyable.h>
#include <AK/NonnullRefPtr.h>
#include <AK/Span.h>
#include <LibGfx/DecodedImageFrame.h>
#include <LibGfx/Forward.h>
#include <LibWeb/Forward.h>
#include <LibWeb/Painting/DisplayListResourceIds.h>
#include <LibWeb/Painting/ExternalContentSource.h>
#include <LibWeb/Painting/VideoFrameSource.h>

namespace Web::Painting {

class DisplayListResourceStorage {
    AK_MAKE_NONCOPYABLE(DisplayListResourceStorage);
    AK_MAKE_DEFAULT_MOVABLE(DisplayListResourceStorage);

public:
    DisplayListResourceStorage() = default;
    ~DisplayListResourceStorage();

    FontResourceId add_font(Gfx::Font const&);
    ImageFrameResourceId add_image_frame(Gfx::DecodedImageFrame const&);
    ExternalContentResourceId add_external_content_source(NonnullRefPtr<ExternalContentSource const>);
    VideoFrameResourceId add_video_frame_source(NonnullRefPtr<VideoFrameSource const>);
    DisplayListResourceId add_display_list(NonnullRefPtr<DisplayList const>);
    void append_referenced_resources_from(DisplayListResourceStorage const& source, ReadonlyBytes command_bytes);

    Gfx::Font const& font(FontResourceId id) const { return *m_fonts.get(id.value()).value(); }
    Gfx::DecodedImageFrame const& image_frame(ImageFrameResourceId id) const { return m_image_frames.get(id.value()).value(); }
    ExternalContentSource const& external_content_source(ExternalContentResourceId id) const { return *m_external_content_sources.get(id.value()).value(); }
    VideoFrameSource const& video_frame_source(VideoFrameResourceId id) const { return *m_video_frame_sources.get(id.value()).value(); }
    DisplayList const& display_list(DisplayListResourceId id) const { return *m_display_lists.get(id.value()).value(); }

private:
    HashMap<u64, NonnullRefPtr<Gfx::Font const>> m_fonts;
    HashMap<u64, Gfx::DecodedImageFrame> m_image_frames;
    HashMap<u64, NonnullRefPtr<ExternalContentSource const>> m_external_content_sources;
    HashMap<u64, NonnullRefPtr<VideoFrameSource const>> m_video_frame_sources;
    HashMap<u64, NonnullRefPtr<DisplayList const>> m_display_lists;
};

}
