Documentation
use crate::command::EmapiCommand;

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EmapiRfidAuthFailurePolicy {
  AllowPrint,
  ForbidPrint,
}

#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum EmapiWifiConnectionState {
  NotConnected,
  HotspotConnected,
  IotConnected,
  Unknown,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct EmapiRfidCardInfo {
  pub paper_model: Option<String>,
  pub paper_length: Option<String>,
  pub paper_width: Option<String>,
  pub paper_color: Option<String>,
  pub paper_material_number: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct EmapiWifiHotspotInfo {
  pub ssid: Option<String>,
  pub rssi: Option<i16>,
  pub ip: Option<String>,
  pub port: Option<String>,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct EmapiPrinterParams {
  pub print_size: Option<u32>,
  pub resolution: Option<u32>,
  pub dots_per_byte: Option<u32>,
}

#[derive(Debug, Clone, PartialEq, Eq, Default)]
pub struct EmapiPrintStatus {
  pub paper_status: Option<u8>,
  pub cover_status: Option<u8>,
  pub low_battery: Option<u8>,
  pub overheat: Option<u8>,
  pub battery_percent: Option<u8>,
  pub battery_voltage: Option<u16>,
  pub tph_temperature: Option<i8>,
}

#[derive(Debug, Clone, PartialEq, Eq)]
pub enum EmapiReport {
  PrintResult {
    command: EmapiCommand,
    result: u8,
  },
  PrinterStatus {
    command: EmapiCommand,
    paper_status: Option<u8>,
    cover_status: Option<u8>,
    battery_state: Option<u8>,
    overheat: Option<u8>,
    nfc_paper_recognition: Option<u8>,
  },
  FlowControl {
    command: EmapiCommand,
    state: u8,
  },
  UpgradeStatus {
    command: EmapiCommand,
    status: u8,
  },
  BluetoothConnection {
    command: EmapiCommand,
    state: u8,
  },
  WifiConfigStatus {
    command: EmapiCommand,
    ssid: Option<String>,
    state: Option<u8>,
  },
  Unknown {
    command: EmapiCommand,
  },
}

impl EmapiReport {
  pub fn command(&self) -> &EmapiCommand {
    match self {
      Self::PrintResult { command, .. }
      | Self::PrinterStatus { command, .. }
      | Self::FlowControl { command, .. }
      | Self::UpgradeStatus { command, .. }
      | Self::BluetoothConnection { command, .. }
      | Self::WifiConfigStatus { command, .. }
      | Self::Unknown { command } => command,
    }
  }

  pub fn is_flow_busy(&self) -> bool {
    matches!(self, Self::FlowControl { state: 1, .. })
  }
}