import { ApiMethods, AuthorizationStateUnion, UPDATE } from '@airgram/api'
import { Airgram } from 'tdweb-airgram'
import { TdProvider } from './TdProvider'
import { TdEventHandler, TdVueConstructor } from './types'

class DollarTd {
  private _authState: AuthorizationStateUnion | { _: null } = { _: null }

  private readonly _authStateUnsubscribe?: () => void

  constructor (private readonly vm: TdVueConstructor) {
    this._authStateUnsubscribe = this.on(UPDATE.updateAuthorizationState, (authState: AuthorizationStateUnion) => {
      this._authState = authState
    })
  }

  public get airgram (): Airgram.AirgramInstance {
    return this.provider.airgram
  }

  public get api (): ApiMethods {
    return this.airgram.api
  }

  public get authState (): AuthorizationStateUnion | { _: null } {
    return this._authState
  }

  private get provider (): TdProvider {
    return this.vm.$_tdProvider
  }

  public _destroy (): void {
    if (this._authStateUnsubscribe) {
      this._authStateUnsubscribe()
    }
  }

  public emit (update: Airgram.Update): Promise<any> {
    return this.airgram.emit(update)
  }

  public off (eventName: string, handler: TdEventHandler): void {
    this.provider.off(eventName, handler)
  }

  public on (eventName: string, handler: TdEventHandler): () => void {
    return this.provider.on(eventName, handler)
  }

  public once (eventName: string, handler: TdEventHandler): () => void {
    return this.provider.once(eventName, handler)
  }
}

export {
  DollarTd
}
