// Copyright (c) 2021 Computer Vision Center (CVC) at the Universitat Autonoma
// de Barcelona (UAB).
//
// This work is licensed under the terms of the MIT license.
// For a copy, see <https://opensource.org/licenses/MIT>.

#pragma once

#include <fstream>

#include "carla/trafficmanager/SimpleWaypoint.h"

namespace carla {
namespace traffic_manager {

  using SimpleWaypointPtr = std::shared_ptr<SimpleWaypoint>;

  class CachedSimpleWaypoint {
  public:
    uint64_t waypoint_id;
    uint32_t road_id;
    uint32_t section_id;
    int32_t lane_id;
    float s;
    std::vector<uint64_t> next_waypoints;
    std::vector<uint64_t> previous_waypoints;
    uint64_t next_left_waypoint  = 0;
    uint64_t next_right_waypoint = 0;
    int32_t geodesic_grid_id;
    bool is_junction;
    uint8_t road_option;

    CachedSimpleWaypoint() = default;
    CachedSimpleWaypoint(const SimpleWaypointPtr& simple_waypoint);

    void Read(const std::vector<uint8_t>& content, unsigned long& start);

    void Read(std::ifstream &in_file);
    void Write(std::ofstream &out_file);

  private:
    template <typename T>
    void WriteValue(std::ofstream &out_file, const T &in_obj) {
      out_file.write(reinterpret_cast<const char *>(&in_obj), sizeof(T));
    }
    template <typename T>
    void ReadValue(std::ifstream &in_file, T &out_obj) {
      in_file.read(reinterpret_cast<char *>(&out_obj), sizeof(T));
    }
    template <typename T>
    void ReadValue(const std::vector<uint8_t>& content, unsigned long& start, T &out_obj) {
      memcpy(&out_obj, &content[start], sizeof(T));
      start += sizeof(T);
    }
  };

} // namespace traffic_manager
} // namespace carla