#!/usr/bin/python
import sys
import argparse
# Thanks gst for messing with argv
argv = sys.argv
sys.argv = []
from openob.node import Node
from openob.link_config import LinkConfig
from openob.audio_interface import AudioInterface
sys.argv = argv

parser = argparse.ArgumentParser(prog='openob')
parser.add_argument('config_host', type=str, help="The configuration server for this OpenOB Node")
parser.add_argument('node_name', type=str, help="The node name for this end")
parser.add_argument('link_name', type=str, help="The link name this OpenOB Manager is operating on; must be the same on both Nodes")
subparsers = parser.add_subparsers(help="The link mode to operate in on this end")
parser_tx = subparsers.add_parser('tx')
parser_tx.add_argument('receiver_host', type=str, help="The receiver for this transmitter. The machine at this address must be running an rx-mode Manager for this link name")
parser_tx.add_argument('-a', '--audio_input', type=str, choices=['auto', 'alsa', 'jack'], default='auto', help="The audio source type for this end of the link")
parser_tx.add_argument('-d', '--alsa_device', type=str, default='hw:0', help="The ALSA audio device when in ALSA audio input mode")
parser_tx.add_argument('-jn', '--jack_name', type=str, default='openob', help="JACK port name root")
parser_tx.add_argument('-aj', '--jack_auto', action='store_false', help="Disable auto connection for Jack inputs")
parser_tx.add_argument('-r', '--samplerate', type=int, default=0, help="Set the sample rate to request from the input (Hz)")
parser_tx.add_argument('-e', '--encoding', type=str, choices=['pcm', 'opus'], default='opus', help="The audio encoding type for this link; PCM for linear audio (16-bit), CELT or Opus (default) for encoded audio")
parser_tx.add_argument('-b', '--bitrate', type=int, default=96, help="Bitrate if using CELT/Opus (in kbit/s)", choices=[16, 24, 32, 48, 64, 96, 128, 192, 256, 384])
parser_tx.add_argument('-p', '--port', type=int, default=3000, help="The base port to use for audio transport. This port must be accessible on the receiving host")
parser_tx.add_argument('-m', '--multicast', type=bool, default=False, help="Start this transmitter in multicast mode, enabling multiple clients to connect at once using the address specified in reciever_host (true/false, default false)")
parser_tx.add_argument('-j', '--jitter_buffer', type=int, default=40, help="The size of the jitter buffer in milliseconds. Affects latency; may be reduced to 5-10ms on fast reliable networks, or increased for poor networks like 3G")
parser_tx.add_argument('-l', '--loss', type=int, default=0, help="Expected packet loss percentage for Opus, between 0 and 100")
parser_tx.add_argument('--dtx', type=bool, default=False, help="Enable Opus Discontinuous Transmission support (true/false, default false)")
parser_tx.add_argument('--fec', type=bool, default=True, help="Enable Opus Inband Forward Error Correction support (true/false, default true)")
parser_tx.add_argument('--complexity', type=int, default=7, help="Opus Computational Complexity, between 0 and 10 - reduce on CPU-constrained devices")
parser_tx.add_argument('--framesize', type=int, default=20, help="Opus frame size (ms)", choices=[2, 5, 10, 20, 40, 60])
parser_tx.set_defaults(mode='tx')

parser_rx = subparsers.add_parser('rx')
parser_rx.add_argument('-a', '--audio_output', type=str, choices=['auto', 'alsa', 'jack', 'pulseaudio'], default='auto', help="The audio output type for this end of the link")
parser_rx.add_argument('-d', '--alsa_device', type=str, default='hw:0', help="The ALSA audio device when in ALSA audio output mode")
parser_rx.add_argument('-jn', '--jack_name', type=str, default='openob', help="JACK port name root")
parser_rx.add_argument('-aj', '--jack_auto', action='store_false', help="Disable auto connection for Jack inputs")
parser_rx.set_defaults(mode='rx')

opts = parser.parse_args()

link_config = LinkConfig(opts.link_name, opts.config_host)
link_config.set_from_argparse(opts)

audio_interface = AudioInterface(opts.node_name)
audio_interface.set_from_argparse(opts)

node = Node(opts.node_name)
node.run_link(link_config, audio_interface)
