// Copyright 2016 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef SRC_BRINGUP_BIN_VIRTCON_TEXTCON_H_
#define SRC_BRINGUP_BIN_VIRTCON_TEXTCON_H_

#include <stddef.h>
#include <stdint.h>

#define TC_MAX_ARG 16
#define TC_MAX_ARG_LENGTH 8  // matches vc title length

typedef struct textcon textcon_t;
typedef uint16_t vc_char_t;

inline vc_char_t vc_char_make(uint8_t ch, uint8_t fg_color, uint8_t bg_color) {
  return static_cast<vc_char_t>(ch | ((fg_color & 0xf) << 8) | ((bg_color & 0xf) << 12));
}

inline uint8_t vc_char_get_char(vc_char_t ch) { return static_cast<uint8_t>(ch & 0xff); }

inline uint8_t vc_char_get_fg_color(vc_char_t ch) { return static_cast<uint8_t>((ch >> 8) & 0xf); }

inline uint8_t vc_char_get_bg_color(vc_char_t ch) { return static_cast<uint8_t>((ch >> 12) & 0xf); }

typedef enum textcon_param {
  TC_INVALID,
  TC_SET_TITLE,
  TC_SHOW_CURSOR,
  TC_HIDE_CURSOR,
} textcon_param_t;

struct textcon {
  void (*putc)(textcon_t* tc, uint8_t c);

  // backing data
  vc_char_t* data;

  // dimensions of display
  int w;
  int h;

  // cursor position
  int x;  // 0 < x <= w; cursor may be one position beyond right edge
  int y;  // 0 < y < h

  // callbacks to update visible display
  void (*invalidate)(void* cookie, int x, int y, int w, int h);
  void (*movecursor)(void* cookie, int x, int y);
  void (*push_scrollback_line)(void* cookie, int y);
  void (*copy_lines)(void* cookie, int y_dest, int y_src, int count);
  void (*setparam)(void* cookie, int param, uint8_t* arg, size_t arglen);
  void* cookie;

  // scrolling region
  int scroll_y0;
  int scroll_y1;

  // saved cursor position
  int save_x;
  int save_y;

  uint8_t fg;
  uint8_t bg;

  uint8_t init_fg;
  uint8_t init_bg;

  // Escape sequence parameter parsing
  // Numeric arguments
  int num;         // Argument currently being read
  int argn_count;  // Number of arguments read into argn[]
  int argn[TC_MAX_ARG];
  // String argument (e.g. for console title)
  int argstr_size;  // Number of characters read into argstr[]
  uint8_t argstr[TC_MAX_ARG_LENGTH + 1];
};

void tc_init(textcon_t* tc, int w, int h, vc_char_t* data, uint8_t fg, uint8_t bg, int cursor_x,
             int cursor_y);

void tc_copy_lines(textcon_t* tc, int y_dest, int y_src, int line_count);

static inline void tc_putc(textcon_t* tc, uint8_t c) { tc->putc(tc, c); }

void tc_seth(textcon_t* tc, int h);

#endif  // SRC_BRINGUP_BIN_VIRTCON_TEXTCON_H_
