import { EmitterSubscription } from "react-native";

declare module "react-native-epos-print" {
  export interface PrinterStatus {
    status: number;
    battery: number;
  }

  export interface PrinterConfig {
    deviceType: number;
    target: string;
    isStatusMonitor?: boolean;
    interval?: number;
    printerModel?: string;
    printerLanguage?: number;
  }

  export interface StatusChangeEvent {
    deviceName: string;
    status: number;
  }

  export interface BatteryStatusChangeEvent {
    deviceName: string;
    battery: number;
  }

  export class Builder {
    initialize(
      printerModel?: string,
      printerLanguage?: number
    ): Promise<boolean>;
    clear(): Promise<boolean>;
    addText(text: string): Promise<Builder>;
    addTextAlign(align: number): Promise<Builder>;
    addTextSize(width: number, height: number): Promise<Builder>;
    addTextFont(font: number): Promise<Builder>;
    addTextSmooth(smooth: boolean): Promise<Builder>;
    addFeed(): Promise<Builder>;
    addFeedLine(line: number): Promise<Builder>;
    addCut(cutType?: number): Promise<Builder>;
    addBarcode(
      data: string,
      symbology: number,
      height: number,
      width: number,
      hri: number
    ): Promise<Builder>;
    addSymbol(
      data: string,
      type: number,
      level: number,
      width: number,
      height: number
    ): Promise<Builder>;
    addImage(
      base64Image: string,
      x: number,
      y: number,
      width: number,
      height: number
    ): Promise<Builder>;
    beginPageMode(
      x: number,
      y: number,
      width: number,
      height: number,
      direction: number
    ): Promise<Builder>;
    endPageMode(): Promise<Builder>;
  }

  export default class EposPrintSdk {
    static initialize(): Promise<boolean>;
    static openPrinter(config: PrinterConfig): Promise<boolean>;
    static closePrinter(): Promise<boolean>;
    static getPrinterStatus(): Promise<PrinterStatus>;
    static sendData(builder: Builder): Promise<PrinterStatus>;
    static addStatusListener(
      callback: (event: StatusChangeEvent) => void
    ): EmitterSubscription;
    static addBatteryStatusListener(
      callback: (event: BatteryStatusChangeEvent) => void
    ): EmitterSubscription;
    static removeStatusListener(subscription: EmitterSubscription): void;
    static removeBatteryStatusListener(subscription: EmitterSubscription): void;
    static createBuilder(): Builder;
  }

  // Connection types
  export const DEVTYPE_TCP: number;
  export const DEVTYPE_BLUETOOTH: number;
  export const DEVTYPE_USB: number;

  // Language constants
  export const LANG_EN: number;
  export const LANG_JA: number;
  export const LANG_ZH_CN: number;
  export const LANG_ZH_TW: number;
  export const LANG_KO: number;
  export const LANG_TH: number;
  export const LANG_VI: number;

  // Alignment constants
  export const ALIGN_LEFT: number;
  export const ALIGN_CENTER: number;
  export const ALIGN_RIGHT: number;

  // Font constants
  export const FONT_A: number;
  export const FONT_B: number;
  export const FONT_C: number;

  // Cut constants
  export const CUT_FEED: number;
  export const CUT_NO_FEED: number;

  // Barcode constants
  export const BARCODE_UPC_A: number;
  export const BARCODE_UPC_E: number;
  export const BARCODE_EAN13: number;
  export const BARCODE_JAN13: number;
  export const BARCODE_EAN8: number;
  export const BARCODE_JAN8: number;
  export const BARCODE_CODE39: number;
  export const BARCODE_ITF: number;
  export const BARCODE_CODABAR: number;
  export const BARCODE_CODE93: number;
  export const BARCODE_CODE128: number;
  export const BARCODE_GS1_128: number;
  export const BARCODE_GS1_DATABAR_OMNIDIRECTIONAL: number;
  export const BARCODE_GS1_DATABAR_TRUNCATED: number;
  export const BARCODE_GS1_DATABAR_LIMITED: number;
  export const BARCODE_GS1_DATABAR_EXPANDED: number;

  // HRI position constants
  export const HRI_NONE: number;
  export const HRI_ABOVE: number;
  export const HRI_BELOW: number;
  export const HRI_BOTH: number;

  // Symbol constants
  export const SYMBOL_PDF417_STANDARD: number;
  export const SYMBOL_PDF417_TRUNCATED: number;
  export const SYMBOL_QRCODE_MODEL_1: number;
  export const SYMBOL_QRCODE_MODEL_2: number;
  export const SYMBOL_QRCODE_MICRO: number;

  // Error correction level constants
  export const LEVEL_L: number;
  export const LEVEL_M: number;
  export const LEVEL_Q: number;
  export const LEVEL_H: number;

  // Direction constants
  export const DIRECTION_LEFT_TO_RIGHT: number;
  export const DIRECTION_BOTTOM_TO_TOP: number;
  export const DIRECTION_RIGHT_TO_LEFT: number;
  export const DIRECTION_TOP_TO_BOTTOM: number;
}
