#ifndef _SCREEN_H
#define _SCREEN_H

#include <Arduino.h>
#include <vector>
#include <string>

#include <Basecamp.hpp>
#include <Configuration.hpp>

#include <U8g2lib.h>
#ifdef U8X8_HAVE_HW_SPI
#include <SPI.h>
#endif
#ifdef U8X8_HAVE_HW_I2C
#include <Wire.h>
#endif

#include "mp3.h"
#include "BME280.h"
#include "image.h"

enum menuType { eNone=0, eMainScreen, eMainMenu };

extern U8G2_SSD1306_128X64_NONAME_F_SW_I2C u8g2;
extern char timeStr[];
extern BME280 bme280;
extern MP3 mp3;
extern menuType menuChange;
extern Basecamp iot;


class Screen {
  public:
//    Screen();
    virtual void draw(void) = 0;
    virtual void next(void);
    virtual void previous(void);
    virtual uint8_t select(void);
    const char* title = "Test Screen";
  private:
};

class SelectionList : public Screen {
  public:
    SelectionList();
    SelectionList(const char*, uint8_t, const char*);
    void draw(void) override;
    void next(void) override;
    void previous(void) override;
    uint8_t select(void) override;
    const char* title = "Cloud Types";
  protected:
    uint8_t current_pos = 0;
    std::vector<std::string> string_list = {
      "Altocumulus",
      "Altostratus",
      "Cirrocumulus",
      "Cirrostratus",
      "Cirrus",
      "Cumulonimbus",
      "Cumulus",
      "Nimbostratus",
      "Stratocumulus",
      "Stratus" };
    uint8_t top_item = 0;
    uint8_t visible = 4;
};

class MainMenu : public SelectionList {
  public:
    MainMenu();
    uint8_t select(void) override;
  private:
};

class MainScreen : public Screen {
  public:
    void draw(void) override;
    void next(void) override;
    void previous(void) override;
    uint8_t select(void) override;
    const char* title = "Main Screen";
  private:
    uint32_t lastVolumeChange = 0;
    u8g2_uint_t titleStr_offset = 0;
    uint8_t volume = 20;
};

#endif /* _SCREEN_H */