import { Event, ListenerIdInfo, TransactionInput } from "../types"

export const SEPERATOR = process.env.BLD_LISTENER_SEPARATOR || "$$$"

export const sleep = (n: number) => new Promise(res => setTimeout(res, n))

export const getTransactionInput = (event: Event): TransactionInput => {
  const { payload = "{}", headers = "{}", query = "{}" } = event

  try {
    return { 
      payload: JSON.parse(payload), 
      headers: JSON.parse(headers), 
      query: JSON.parse(query), 
      event 
    }
  } catch(e) {
    console.error("Error parsing transaction input", e, "event: ", event)
    return { payload, headers, query, event }
  }
}

export const getPartialTopic = ({ eventName, platform, label }: { eventName: string; platform: string; label: string; }) => {
  return `${platform}.${label}.${eventName}`
}

export const getListenerId = ({ eventName, txKey, platform, label }: ListenerIdInfo) => {
  const partialTopic = getPartialTopic({ eventName, platform, label })
  return partialTopic + SEPERATOR + txKey
}

export const deconstructListenerId = (id: string) => {
  const [partialTopic, txKey] = id.split(SEPERATOR)
  const [platform, label, ...rest] = partialTopic.split(".")
  const eventName = rest.join(".")
  
  return {
    platform,
    label,
    eventName,
    txKey
  }
}