#pragma once

#include <vector>
#include <cstdint>
#include <cstring>
#include <lz4.h>
#include <stdexcept>
#include <algorithm>
#include <iostream>

#define BLOCK_SIZE          131072 // 128KB

struct BlockSize
{
	uint32_t raw;
	uint32_t zip;
};

class CompressingManager
{
public:
	CompressingManager();
	~CompressingManager();

	// Kompresja danych
	std::vector<char> compress(const std::vector<char>&);

	// Dekompresja
	std::vector<char> decompress(const std::vector<char>&);

private:
	std::vector<BlockSize> blockSizes;

	// Przekonwertuj zmienną na ciąg na vector
	template <typename T>
	void addIntToVector(std::vector<char>& vec, const T& val)
	{
		size_t tmpSize = vec.size();
		vec.resize(tmpSize + sizeof(val));
		std::memcpy(vec.data() + tmpSize, &val, sizeof(val));
	}

	// Pobierz zmienną z vectora
	template <typename T>
	T getIntFromVector(const std::vector<char>& vec, size_t& offset)
	{
		T tmp{};
		std::memcpy(&tmp, vec.data() + offset, sizeof(tmp));
		offset += sizeof(tmp);
	
		return tmp;
	}
};

