#ifndef LIBMUEB_CONFIGURATION_H_
#define LIBMUEB_CONFIGURATION_H_

#include <QHostAddress>
#include <QImage>
#include <QObject>
#include <QSettings>
#include <cstdint>

// TODO check, remove unused parameters
// TODO check, variable types
class Configuration : public QObject {
  Q_OBJECT

 public:
  explicit Configuration(QObject *parent = nullptr);

  QImage frame() const;

  QHostAddress target_address() const;

  std::uint32_t floors() const;

  std::uint32_t rooms_per_floor() const;

  std::uint32_t windows_per_room() const;

  std::uint32_t vertical_pixel_unit() const;

  std::uint32_t horizontal_pixel_unit() const;

  std::uint32_t pixels_per_window() const;

  std::uint32_t window_per_floor() const;

  std::uint32_t windows() const;

  std::uint32_t pixels() const;

  std::int32_t width() const;

  std::int32_t height() const;

  std::uint8_t protocol_type() const;

  std::uint32_t window_byte_size() const;

  std::uint32_t max_windows_per_datagram() const;

  std::uint32_t packet_header_size() const;

  std::uint32_t packet_size() const;

  std::uint32_t packet_payload_size() const;

  std::uint32_t max_pixel_per_datagram() const;

  std::uint32_t remainder_packet_size() const;

  std::uint16_t unicast_animation_port() const;

  std::uint16_t broadcast_animation_port() const;

  std::uint8_t max_packet_number() const;

  std::uint8_t color_depth() const;

  std::uint8_t factor() const;

  bool debug_mode() const;

 private:
  QImage frame_;
  QSettings settings_;
  QHostAddress target_address_;
  std::uint32_t floors_;
  std::uint32_t rooms_per_floor_;
  std::uint32_t windows_per_room_;
  std::uint32_t vertical_pixel_unit_;
  std::uint32_t horizontal_pixel_unit_;
  std::uint32_t pixels_per_window_;
  std::uint32_t window_per_floor_;
  std::uint32_t windows_;
  std::uint32_t pixels_;
  // Qt width, height is signed
  std::int32_t width_;
  std::int32_t height_;
  //
  std::uint8_t protocol_type_;
  std::uint32_t window_byte_size_;
  std::uint32_t max_windows_per_datagram_;
  std::uint32_t packet_header_size_;
  std::uint32_t packet_size_;
  std::uint32_t packet_payload_size_;
  std::uint32_t max_pixel_per_datagram_;
  std::uint32_t remainder_packet_size_;
  std::uint16_t unicast_animation_port_;
  std::uint16_t broadcast_animation_port_;
  std::uint8_t max_packet_number_;
  std::uint8_t color_depth_;
  std::uint8_t factor_;
  bool debug_mode_;

  void LoadSettings();
};

#endif  // LIBMUEB_CONFIGURATION_H_