// 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_VIRTCON_TEXTCON_H_
#define SRC_BRINGUP_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_VIRTCON_TEXTCON_H_
