#pragma once

#include "LZ77/LZLookupTable.hpp"

class LZBase {
public:
  explicit LZBase(atInt32 minimumOffset = 1, atInt32 slidingWindow = 4096, atInt32 minimumMatch = 3,
                  atInt32 blockSize = 8);
  virtual ~LZBase();

  virtual atUint32 compress(const atUint8* src, atUint8** dest, atUint32 srcLength) = 0;
  virtual atUint32 decompress(const atUint8* src, atUint8** dest, atUint32 srcLength) = 0;

  void setSlidingWindow(atInt32 SlidingWindow);
  atInt32 slidingWindow() const;
  void setReadAheadBuffer(atInt32 ReadAheadBuffer);
  atInt32 readAheadBuffer() const;
  void setMinMatch(atInt32 minimumMatch);
  atInt32 minMatch() const;
  void setBlockSize(atInt32 BlockSize);
  atInt32 blockSize() const;
  void setMinimumOffset(atUint32 minimumOffset);
  atUint32 minimumOffset() const;

protected:
  LZLengthOffset search(const atUint8* posPtr, const atUint8* dataBegin, const atUint8* dataEnd) const;

  atInt32 m_slidingWindow;
  atInt32 m_readAheadBuffer;
  atInt32 m_minMatch; // Minimum number of bytes that have to matched to go through with compression
  atInt32 m_blockSize;
  atUint32 m_minOffset;
  LZLookupTable m_lookupTable;
};
