#pragma once

#include "32blit.hpp"

#define ROW_HEIGHT 14

using namespace blit;

enum class SortBy {
  name,
  size
};

enum class Screen {
  main,
  credits,
  screenshot
};

enum class GameType : uint8_t {
  game,
  file,
  screenshot
};

struct GameInfo {
  GameType type;
  bool can_launch = true; // use in future to flag games with an API mismatch
  char ext[5]{0};

  std::string title;
  uint32_t size;

  std::string filename;
};

struct DirectoryInfo {
  std::string name;
  int x, w;
};

int selected_menu_item;

class AutoRepeat {
  public:
    AutoRepeat(uint32_t repeat_time=200, uint32_t hold_time=1000) {
      this->repeat_time = repeat_time;
      this->hold_time = hold_time;
    }
    bool next(uint32_t time, bool state) {
      bool changed = state != last_state;
      last_state = state;

      if(changed) {
        if(state) {
          pressed_time = time;
          pressed = true;
          last_time = time;
          return true;
        }
        else {
          pressed_time = 0;
          pressed = false;
          last_time = 0;
        }
      }
      // Shortcut for no auto-repeat
      if(repeat_time == 0) return false;

      if(pressed) {
        uint32_t repeat_rate = repeat_time;
        if(hold_time > 0 && time - pressed_time > hold_time) {
          repeat_rate /= 3;
        }
        if(time - last_time > repeat_rate) {
          last_time = time;
          return true;
        }
      }

      return false;
    }
  private:
    uint32_t repeat_time;
    uint32_t hold_time;
    bool pressed = false;
    bool last_state = false;
    uint32_t pressed_time = 0;
    uint32_t last_time = 0;
};

