#ifndef TERMINAL_H
#define TERMINAL_H

#include <string>
#include <vector>

class Terminal {
private:
  int posx, posy;
  std::vector<std::pair<int, int>> saved_cursor_position;
  std::string ansi;
  int in_ansi;
  int fgcolor, bgcolor, status;

public:
  enum ANSI_TYPE { START, CURSOR, COLOR, CLEAR, OTHER };
  struct termchar {
    int in_ansi;
    ANSI_TYPE ansi;
  };

public:
  Terminal(void);
  Terminal(const Terminal &old);
  Terminal &operator=(Terminal &rhs);

  void init(void);
  std::string color_restore(void);
  termchar putchar(char ch);
  void putstring(std::string text);

  int getx(void);
  int gety(void);
  int getstatus(void);
  int inANSI(void);
  int fg(void);
  int bg(void);
  bool ansiempty(void);

private:
  void ansi_color(int color);
  ANSI_TYPE ansi_code(std::string ansi);
};

// notice the curstor position history vector is missing from the struct below?
// Yes, it is a global.  Completely WRONG.  Broken!  Bad!

struct console_details {
  int posx, posy;
  int savedx, savedy;
  char ansi[20]; // current ANSI command being processed.
  int in_ansi;
  int fgcolor; // 0-7 // not 0-15
  int bgcolor; // 0-7
  int status;  // 0, 1 or 5 (Blink)
};

enum ANSI_TYPE { START, CURSOR, COLOR, CLEAR, OTHER };

struct termchar {
  int in_ansi;
  ANSI_TYPE ansi; // undefined if in_ansi is false
};

void console_init(struct console_details *cdp);
void ansi_color(struct console_details *cdp, int color);
const char *color_restore(struct console_details *cdp);
ANSI_TYPE console_ansi(struct console_details *cdp, const char *ansi);

termchar console_char(struct console_details *cdp, char ch);
void console_receive(struct console_details *cdp, std::string chars);

#endif