///|
/// Event types for TUI applications

///|
/// Key modifiers
pub(all) enum KeyModifier {
  None
  Shift
  Ctrl
  Alt
  CtrlShift
  CtrlAlt
  ShiftAlt
  CtrlShiftAlt
} derive(Debug)

///|
fn[T : Debug] show_debug(value : T, logger : &Logger) -> Unit {
  value.to_repr().output(logger)
}

///|
pub impl Show for KeyModifier with fn output(
  self : KeyModifier,
  logger : &Logger,
) -> Unit {
  show_debug(self, logger)
}

///|
/// Special keys
pub(all) enum SpecialKey {
  Up
  Down
  Left
  Right
  Home
  End
  PageUp
  PageDown
  Insert
  Delete
  Tab
  BackTab
  Backspace
  Enter
  Escape
  F(Int)
} derive(Debug)

///|
pub impl Show for SpecialKey with fn output(self : SpecialKey, logger : &Logger) -> Unit {
  show_debug(self, logger)
}

///|
/// Keyboard event
pub(all) enum KeyEvent {
  Char(Char, KeyModifier)
  Special(SpecialKey, KeyModifier)
} derive(Debug)

///|
pub impl Show for KeyEvent with fn output(self : KeyEvent, logger : &Logger) -> Unit {
  show_debug(self, logger)
}

///|
/// Mouse button
pub(all) enum MouseButton {
  Left
  Middle
  Right
  ScrollUp
  ScrollDown
  None
} derive(Debug)

///|
pub impl Show for MouseButton with fn output(
  self : MouseButton,
  logger : &Logger,
) -> Unit {
  show_debug(self, logger)
}

///|
/// Mouse event type
pub(all) enum MouseEventType {
  Press
  Release
  Move
  Drag
} derive(Debug)

///|
pub impl Show for MouseEventType with fn output(
  self : MouseEventType,
  logger : &Logger,
) -> Unit {
  show_debug(self, logger)
}

///|
/// Mouse event
pub(all) struct MouseEvent {
  button : MouseButton
  event_type : MouseEventType
  x : Int
  y : Int
  modifier : KeyModifier
} derive(Debug)

///|
pub impl Show for MouseEvent with fn output(self : MouseEvent, logger : &Logger) -> Unit {
  show_debug(self, logger)
}

///|
/// Input event
pub(all) enum InputEvent {
  Key(KeyEvent)
  Mouse(MouseEvent)
  Resize(Int, Int)
  Unknown(String)
} derive(Debug)

///|
pub impl Show for InputEvent with fn output(self : InputEvent, logger : &Logger) -> Unit {
  show_debug(self, logger)
}

///|
/// Hit test result
pub(all) struct HitTestResult {
  id : String
  x : Int
  y : Int
  width : Int
  height : Int
  role : @core.Role?
}

///|
/// Focus state for the application
pub(all) enum FocusState {
  None
  Focused(String) // Component ID
}

///|
/// Input mode for the application
pub(all) enum InputMode {
  Normal // Raw mode, full keyboard control
  Editing // Non-raw mode, IME enabled
}