#pragma once #include #include #include #include "CacheManager.h" /** @brief single pokemon card */ class PokemonCard { private: nlohmann::json raw_data; virtual void raw_load_json(nlohmann::json raw_data); virtual void raw_load_cache(const char* cache_path); CacheManager* cache_ref = nullptr; public: PokemonCard(CacheManager* cache_ref = nullptr); virtual ~PokemonCard(); /** @brief string stream output (for printing card) */ friend std::ostream& operator << (std::ostream& output, const PokemonCard& card); std::string id; /** @brief pokemon id (with set prefix) */ std::string name; /** @brief pokemon name */ unsigned hp; /** @brief pokemon max health points */ double value; /** @brief pokemon card current market value */ std::vector attacks; /** @brief list of possible attacks */ /** @brief use API to fetch `this->hp` */ virtual void fetch_market_value(); /** @brief check if all files are downloaded */ virtual void verify_files(); /** @brief download images */ virtual void download_files(); struct from_json; // named constructors (defined below) struct from_cache; /** @brief set cache */ virtual void set_cache(CacheManager* cache_ref); }; struct PokemonCard::from_json : public PokemonCard { from_json(nlohmann::json json_data) : PokemonCard() { PokemonCard::raw_load_json(json_data); } }; struct PokemonCard::from_cache : public PokemonCard { from_cache(CacheManager* cache_ref, std::string cache_path) : PokemonCard(cache_ref) { PokemonCard::raw_load_cache(cache_path.c_str()); } };