#!/usr/bin/env ts-node

import yargs from 'yargs'
import { existsSync, createReadStream } from 'fs'
import { minimal, common, ardupilotmega } from 'mavlink-mappings'
import { createMavLinkStream, MavLinkPacket, Logger, LogLevel, MavLinkPacketRegistry } from '..'
import { dump } from '..'

Logger.on('log', ({ context, level, message }) => {
  if (level <= LogLevel.error) {
    console.log(`${new Date().toISOString()} ${context} [${LogLevel[level]}]`, ...message)
  }
})

async function configure() {
  return yargs(process.argv.slice(2))
    .command('e2e', 'Execute end to end serialization/deserialization verification',
      yargs => yargs.positional('input', {
        description: 'Input file (- for stdin)',
        default: '-'
      }),
      argv => {
        if (argv.input !== '-' && !existsSync(argv.input)) {
          console.error(`error: ${argv.input} not found`)
          process.exit(1)
        }
      }
    )
    .help()
    .alias('help', 'h')
    .parse()
}

async function main() {
  const config = await configure()

  const command = config._[0]
  if (command === 'e2e') {
    const REGISTRY: MavLinkPacketRegistry = {
      ...minimal.REGISTRY,
      ...common.REGISTRY,
      ...ardupilotmega.REGISTRY,
    }

    const input = config.input === '-' ? process.stdin : createReadStream(config.input)
    const reader = createMavLinkStream(input, dump)

    reader.on('data', (packet: MavLinkPacket) => {
      const clazz = REGISTRY[packet.header.msgid]
      if (clazz) {
        packet.protocol.data(packet.payload, clazz)
      } else {
        console.log('< (unknown)', packet.debug())
      }
    })
  }
}

main()