#ifndef mapConfig_h
#define mapConfig_h

#include <string>

// #include "log.h"

namespace jf {

struct MapConfig {
    /**
     * @brief map文件路径
     *
     */
    static std::string map_file_dir;
    /**
     * @brief map应用类型
     *
     */
    static std::string map_use_type;
    /**
     * @brief tag
     *
     */
    static std::string tag;
    /**
     * @brief 区块lat跨度
     *
     */
    static double tile_lat_interval;
    /**
     * @brief 区块lon跨度
     *
     */
    static double tile_lon_interval;
    /**
     * @brief 地图点间插值距离
     *
     */
    static double node_interpolate;
    /**
     * @brief 算法取附近rect区域时lon方向半轴长
     *
     */
    static double gps_rect_lon_metres_half;
    /**
     * @brief 算法取附近rect区域时lat方向半轴长
     *
     */
    static double gps_rect_lat_metres_half;
    /**
     * @brief 算法取附近rect区域时lon方向半轴长(寻路用)
     *
     */
    static double route_rect_lon;
    /**
     * @brief 算法取附近rect区域时lat方向半轴长(寻路用)
     *
     */
    static double route_rect_lat;
    /**
     * @brief 四叉树最大深度
     *
     */
    static int qt_max_level;
    /**
     * @brief 算法从一点开始往下缕几个node
     *
     */
    static int algorithm_path_len;
    /**
     * @brief 候选节点数量
     *
     */
    static int algorithm_condidate_max;
    /**
     * @brief 换路惩罚除数
     *
     */
    static float algorithm_change_road_punish_div;
    /**
     * @brief 掉头惩罚系数
     *
     */
    static double algorithm_change_direction_punish_range_max;

    /**
     * @brief 过滤road逻辑表达式
     *
     */
    static std::string map_road_filer_logic;
    /**
     * @brief gps文件路径
     *
     */
    static std::string gps_file_path;
    /**
     * @brief 序列化格式
     *
     */
    static int serialize_type_json1_binary2;
    /**
     * @brief tile是否加密
     *
     */
    static bool tile_encrypt;

    /**
     * @brief profiler时间间隔
     *
     */
    static int profiler_interval;

    /**
     * @brief log目录
     *
     */
    static std::string logDir;

    /**
     * @brief 寻路结果保存地址
     *
     */
    static std::string road_plan_file_dir;

    /**
     * @brief 途径点之间的最小距离（超过该值，途径点会被抛弃）
     *
     */
    // static double road_plan_min_waypoint_dis;

    /**
     * @brief 寻路结果所包含的最大link数（超过该值，寻路会失败）
     *
     */
    // static int road_plan_max_links;

    /**
     * @brief 寻路失败最大次数（超过该值，将会退到上一段途径点之间的寻路结果）
     *
     */
    // static int road_plan_max_failes;

    /**
     * @brief 切地图选项
     *
     */
    struct map_pre_option_st {
        // road表只保存rank在min max范围内的
        static int road_rank_min;
        static int road_rank_max;
    };
    static map_pre_option_st map_pre_option;

    struct hdConfig {
        static std::string save_dir_json;
        static std::string save_dir_binary;
    };

    static hdConfig hd_config;

    struct sdConfig {
        static std::string save_dir_json;
        static std::string save_dir_binary;
    };

    static sdConfig sd_config;

    static void Init(const std::string &projectDir, const std::string &configJsonPath);

    static std::string GetProjectDir() { return projectDir; }

    static std::string sdid2hdid_path;

   private:
    static std::string projectDir;
};

}  // namespace jf
#endif