#pragma once

#include <types.h>
#include <misc/GlobalSettings.h>
#include <file/Path.h>

namespace default_config {
    using namespace cmn;
    
    void get(sprite::Map& config, GlobalSettings::docs_map_t& docs, decltype(GlobalSettings::set_access_level)* fn);
    void warn_deprecated(const std::string& source, sprite::Map& map);
    void warn_deprecated(const std::string& source, const std::map<std::string, std::string>& keys);
    bool is_deprecated(const std::string& key);
    const std::map<std::string, std::string>& deprecations();
    std::string replacement(const std::string& key);
    std::string generate_delta_config(bool include_build_number = false, std::vector<std::string> additional_exclusions = {});
    void register_default_locations();
    void load_string_with_deprecations(const file::Path& source, const std::string& content, sprite::Map& map, AccessLevel, bool quiet = false);

    file::Path conda_environment_path();


    /*template<typename T>
    struct HasDocsMethod
    {
        template<typename U, size_t (U::*)() const> struct SFINAE {};
        template<typename U> static char Test(SFINAE<U, &U::used_memory>*);
        template<typename U> static int Test(...);
        static const bool Has = sizeof(Test<T>(0)) == sizeof(char);
    };*/
    
    ENUM_CLASS(recognition_border_t, none, heatmap, outline, shapes, grid, circle);
    ENUM_CLASS_HAS_DOCS(recognition_border_t)

    ENUM_CLASS(heatmap_normalization_t, none, value, cell, variance);
    ENUM_CLASS_HAS_DOCS(heatmap_normalization_t)

    ENUM_CLASS(recognition_normalization_t, none, moments, posture, legacy);
    ENUM_CLASS_HAS_DOCS(recognition_normalization_t)
    
    ENUM_CLASS(gui_recording_format_t, avi, jpg, png);
    ENUM_CLASS_HAS_DOCS(gui_recording_format_t)
    
    ENUM_CLASS(peak_mode_t, pointy, broad);
    ENUM_CLASS_HAS_DOCS(peak_mode_t)

    ENUM_CLASS(matching_mode_t, accurate, approximate, hungarian, benchmark)
    ENUM_CLASS_HAS_DOCS(matching_mode_t)

    ENUM_CLASS(output_format_t, csv, npz)
    ENUM_CLASS_HAS_DOCS(output_format_t)
}

namespace gui {
ENUM_CLASS(mode_t, blobs, tracking, optical_flow)

}