#pragma once

#include <vector>
#include <cstdint>
#include <cstring>
#include <stdexcept>
#include <algorithm>
#include <iostream>

#include "EncryptionManager.h"
#include "CompressionManager.h"

#define BLOCK_SIZE          131072 // 128KB

class ChunkManager
{
public:
	ChunkManager(EncryptionManager& em);
	~ChunkManager();

	// Kompresja danych
	std::vector<char> chunked(const std::vector<char>&, const bool&, const bool&);

	// Dekompresja
	std::vector<char> dechunked(const std::vector<char>&, const bool&, const bool&);

private:
	EncryptionManager eman;
	CompressionManager cman;

	// 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;
	}
};

