#ifndef __JFXMAP_BOSCH_MAPINTERFACE_HPP_
#define __JFXMAP_BOSCH_MAPINTERFACE_HPP_

#include "HdLib.h"
#include "InterfaceDefine.hpp"
#include "LanePlan.h"

namespace jf {

class MapInterface {
   public:
    MapInterface(const std::string strPrjPath, const std::string strCfgPath, const double sc_dLMReportDis);
    ~MapInterface();

   public:

    bool setGlobalPathPlanning(const SetPathMsg_& cspmWayNode, PathPlanMsg_& ppmOutPath);

    bool dynamicPathPlanning(const GpsData_& cgdCurLoc, PathPlanMsg_& ppmOutPath);

    bool GetPathAhead(const GpsData_& cgdCurLoc, PathAheadMsg_& pamOutAhead);

   private:
    // 获取道路规划信息
    bool calculatePathPlanning(PathPlanMsg_& ppmOutPath);

    // 生成Link数据
    bool ConvertLink(const LaneEndpoint& cleCurLaneEndpoint, std::map<int64_t,int32_t> &HeightLimitMap,std::map<int64_t,int32_t>& weightLimitMap, link_& jlOutLink);

    // 生成Landmark数据
    bool ConvertLandmark(const Point& cptInPoint, const LaneEndpoint& cleCurLaneEndpoint, std::vector<landmark_>& vctjlOutLandmark,std::vector<double> &vctdSegmentDis, std::map<int64_t,int32_t> &heightLimitMap,std::map<int64_t,int32_t>& weightLimitMap);
    // 生成Block数据
    bool ConvertBlock(const LaneEndpoint& cleCurLaneEndpoint, const LaneEndpoint& cleNxtLaneEndpoint, std::vector<block_>& jbOutBlock);

    // 计算当前坐标点所在的LanEndpoint在整体规划结果中的索引
    bool GetIndex(const Point& cptPoint, int& nOutIndex, int nPastIndex = 0);

    // 获取垂足信息
    bool GetPerFootInfo(const Point& cptInPoint, const LaneEndpoint& cleCurLaneEndpoint, int& nOutIndex, Point& ptOutPerFootPoint);

    // 是否已经到达终点
    bool IsReachedEnd(const Point& cptPoint);

    //
    bool GetLaneChange(const LaneEndpoint cleEndpoint, int& nOutLaneChange, int& nOutFixIdx);

    bool handleReportDistance(const Point &cptInPoint, const LaneEndpoint &cleCurLaneEndpoint, std::vector<double> &vctdOutSegDistance);

    bool filterTargetPoint(const Point &inTargetPoint, Point &outTargetPoint);

   private:
    // 路径管理对象
    LanePlan m_lpPlan;

    // 途径点信息
    std::vector<Point> m_vctptWayPoint;

    // 记录起点所在的车道（因为规划的路径，有可能有起点车道无法到达目的地，使用相邻车道规划的情况，此时不判断起点偏离车道，不再重新寻路）
    std::vector<LaneEndpoint> m_vctleStartEndpoint;

    // 途径点所在的LaneEndpoint的信息，用作偏离路径时重新规划用
    std::vector<LaneEndpoint> m_vctleWayPoint;

    // 途径点所在的LaneEndpoint在路径规划结果中的索引，用于偏离路径时重新规划用
    std::vector<int> m_vctnWayPointIdxInPath;

    // 已经过了多少个LaneEndpoint
    int m_nLastIdx;
    // 上一次收到的坐标点
    Point m_ptLastPos;
    // 终点所在的LanEndpoint中的索引，用于判断是否到达终点
    int m_nEndPosIdxInLastLane;


    //路径规划状态标志位
    uint8_t statusFlagOfPathPlanning; // 0：没有设置全局  1：局部路径规划过程中
    //前方道路信息播报距离 （米）
    double sc_dLMReportDis;

};

}  // namespace jf

#endif
