#pragma once
#include <filesystem>
#include <fstream>
#include <map>
#include <optional>
#include <string>
#include <unordered_map>
#include <vector>
#include "cloudini_lib/cloudini.hpp"
namespace mcap {
class McapReader;
class McapWriter;
class FileStreamReader;
}
class McapConverter {
public:
using TopicsMap = std::unordered_map<std::string, std::string>;
TopicsMap open(std::filesystem::path file_in);
void addProfile(const std::string& profile);
void encodePointClouds(
std::filesystem::path file_out, std::optional<float> default_resolution,
Cloudini::CompressionOption mcap_writer_compression);
void decodePointClouds(std::filesystem::path file_out, Cloudini::CompressionOption mcap_writer_compression);
std::vector<std::pair<std::string, float>> getProfile() const;
void printStatistics() const;
private:
std::ifstream input_stream_;
std::shared_ptr<mcap::FileStreamReader> data_source_;
std::shared_ptr<mcap::McapReader> reader_;
TopicsMap topics_;
void duplicateSchemasAndChannels(const mcap::McapReader& reader, mcap::McapWriter& writer, bool encoding);
std::map<uint16_t, uint16_t> old_to_new_schema_id_;
std::map<uint16_t, uint16_t> old_to_new_channel_id_;
std::map<std::string, float> profile_resolutions_;
size_t processed_messages_ = 0;
size_t total_input_bytes_ = 0;
size_t total_output_bytes_ = 0;
std::chrono::microseconds total_processing_time_ = std::chrono::microseconds(0);
};