#pragma once

#include "ccm/domain/DigiBattle99Card.hpp"
#include "ccm/games/IGameModule.hpp"
#include "ccm/services/CardPreviewService.hpp"
#include "ccm/services/CollectionService.hpp"
#include "ccm/services/ConfigService.hpp"
#include "ccm/services/DigiBattle99SetCatalogService.hpp"
#include "ccm/services/ImageService.hpp"
#include "ccm/services/SetService.hpp"
#include "ccm/ui/IGameView.hpp"

#include <array>
#include <string>
#include <string_view>
#include <vector>

class wxBitmapButton;
class wxBoxSizer;
class wxPanel;
class wxSimplebook;
class wxSplitterWindow;
class wxStaticText;
class wxTextCtrl;

namespace ccm::ui {

class DigiBattle99CardListPanel;
class DigiBattle99SelectedCardPanel;
class DigiBattle99SetCompletionPanel;

class DigiBattle99GameView final : public IGameView {
public:
    DigiBattle99GameView(ConfigService&                         config,
                         CollectionService<DigiBattle99Card>&   collection,
                         SetService&                            sets,
                         ImageService&                          images,
                         CardPreviewService&                    cardPreview,
                         IGameModule&                           module,
                         DigiBattle99SetCatalogService&         catalogStore);

    [[nodiscard]] Game        gameId() const noexcept override { return Game::DigiBattle99; }
    [[nodiscard]] std::string displayName() const override { return "Digimon (Digi-Battle)"; }

    wxPanel* listPanel(wxWindow* parent) override;
    wxPanel* selectedPanel(wxWindow* parent) override;
    wxPanel* contentPanel(wxWindow* parent) override;
    [[nodiscard]] wxPanel* contentPanelIfCreated() const noexcept override {
        return contentPanel_;
    }
    [[nodiscard]] bool hostsOwnLayout() const noexcept override { return true; }

    void refreshCollection(std::optional<std::uint32_t> selectId = std::nullopt) override;
    void onAddCard(wxWindow* parentWindow) override;
    void onEditCard(wxWindow* parentWindow) override;
    void onDeleteCard(wxWindow* parentWindow) override;
    std::string onUpdateSets(wxWindow* parentWindow) override;
    void setFilter(std::string_view filter) override;
    void nudgeSelection(int delta) override;
    void applyTheme(const ThemePalette& palette) override;
    [[nodiscard]] std::string updateSetsMenuLabel() const override {
        return "Update Digimon (Digi-Battle)";
    }

private:
    void syncEditToolbarVisibility();
    void ensureSetsLoaded();
    const std::vector<Set>& setsForDialog();
    void ensureSingleCardsMounted(wxWindow* splitterParent);
    void buildSingleCardsToolbar(wxWindow* parent, wxBoxSizer* pageSizer);
    void buildTabBar(wxWindow* parent, wxBoxSizer* rootSizer);
    void selectTab(int index);
    void refreshToolbarIcons(const ThemePalette& palette);
    void refreshTabBarTheme(const ThemePalette& palette);

    ConfigService&                        config_;
    CollectionService<DigiBattle99Card>&  collection_;
    SetService&                           sets_;
    ImageService&                         images_;
    CardPreviewService&                   cardPreview_;
    IGameModule&                          module_;
    DigiBattle99SetCatalogService&        catalogStore_;

    wxPanel*                       contentPanel_{nullptr};
    wxPanel*                       tabBar_{nullptr};
    wxSimplebook*                  book_{nullptr};
    wxSplitterWindow*              singleSplitter_{nullptr};
    DigiBattle99CardListPanel*     listPanel_{nullptr};
    DigiBattle99SelectedCardPanel* selectedPanel_{nullptr};
    DigiBattle99SetCompletionPanel* setCompletionPanel_{nullptr};
    std::array<wxPanel*, 2>        tabPanels_{{nullptr, nullptr}};
    std::array<wxStaticText*, 2>   tabLabels_{{nullptr, nullptr}};
    int                            activeTab_{0};
    std::array<wxBitmapButton*, 3> toolbarButtons_{{nullptr, nullptr, nullptr}};
    wxTextCtrl*                    filterInput_{nullptr};
    std::vector<Set>               setsCache_;
    bool                           attemptedInitialSetLoad_{false};
};

}  // namespace ccm::ui
