import { version } from './version'
import type {
  SocketState,
  ChannelState,
  ChannelEvent as PhoenixChannelEvent,
  Transport,
  Vsn,
} from '../phoenix/types'

export type { SocketState, ChannelState, Transport }

export const DEFAULT_VERSION = `realtime-js/${version}`

export const VSN_1_0_0: Vsn = '1.0.0'
export const VSN_2_0_0: Vsn = '2.0.0'
export const DEFAULT_VSN: Vsn = VSN_2_0_0

export const VERSION = version

export const DEFAULT_TIMEOUT = 10000

export const WS_CLOSE_NORMAL = 1000
export const MAX_PUSH_BUFFER_SIZE = 100

export const SOCKET_STATES = {
  connecting: 0,
  open: 1,
  closing: 2,
  closed: 3,
} as const

export const CHANNEL_STATES = {
  closed: 'closed',
  errored: 'errored',
  joined: 'joined',
  joining: 'joining',
  leaving: 'leaving',
} as const

export type ChannelEvent = PhoenixChannelEvent | 'access_token'

export const CHANNEL_EVENTS = {
  close: 'phx_close',
  error: 'phx_error',
  join: 'phx_join',
  reply: 'phx_reply',
  leave: 'phx_leave',
  access_token: 'access_token',
} as const

export const TRANSPORTS = {
  websocket: 'websocket',
} as const

export type ConnectionState = 'connecting' | 'open' | 'closing' | 'closed' | (string & {})

export const CONNECTION_STATE = {
  connecting: 'connecting',
  open: 'open',
  closing: 'closing',
  closed: 'closed',
} as const
