import { KioskConnection, KioskConnectionOptions } from './KioskConnection';

export interface MonitoringOptions {
  url: string;
  onConnectionUpdate?: (isConnected: boolean) => void;
}

export class KioskSDK {
  private connection: KioskConnection | null = null;
  private currentKioskId: string = 'default';

  constructor(initialKioskId: string = 'default') {
    this.currentKioskId = initialKioskId;
  }

  public setKioskId(kioskId: string) {
    this.currentKioskId = kioskId;
    // Disconnect existing connection if the kioskId changes
    if (this.connection) {
      this.disconnect();
    }
  }

  public initializeMonitoring(options: MonitoringOptions): KioskConnection {
    if (this.connection) {
      this.disconnect();
    }

    this.connection = new KioskConnection({
      url: options.url,
      kioskId: this.currentKioskId,
      onConnectionUpdate: options.onConnectionUpdate
    });

    // Connect immediately after initialization
    this.connection.connect();

    return this.connection;
  }

  public connect(url: string, onConnectionUpdate?: (isConnected: boolean) => void): void {
    this.initializeMonitoring({ url, onConnectionUpdate });
  }

  public async disconnect(): Promise<void> {
    if (this.connection) {
      await this.connection.disconnect();
      this.connection = null;
    }
  }

  public isConnected(): boolean {
    return this.connection?.isConnectionOpen() || false;
  }

  public getCurrentKioskId(): string {
    return this.currentKioskId;
  }
}

// Create and export singleton instance
export const kioskSDK = new KioskSDK('default');

// Export types
export type { KioskConnectionOptions };