#!/usr/bin/env python

#---------------------------------------------------------------------------
#
#  chirp-receive: Listens for chirps via the system's default audio input.
#
#  This file is part of the Chirp Python SDK.
#  For full information on usage and licensing, see https://chirp.io/
#
#  Copyright (c) 2011-2018, Asio Ltd.
#  All rights reserved.
#
#---------------------------------------------------------------------------

import argparse
import configparser
import os
import time
import sys

from chirpsdk import ChirpConnect, CallbackSet


class Callbacks(CallbackSet):
    def __init__(self, args=None):
        self.args = args

    def on_receiving(self, channel):
        print('Decode started...')

    def on_received(self, payload, channel):
        if payload is None:
            print('Decode failed')
        else:
            if self.args.unicode:
                print('Received ' + payload.decode('utf-8'))
            elif self.args.hex:
                print('Received ' + str(payload))
            else:
                print('Received: ' + str(list(payload)))


def main(args):
    # ------------------------------------------------------------------------
    # Read ~/.chirprc
    # ------------------------------------------------------------------------
    config = configparser.ConfigParser()
    config.read(os.path.expanduser('~/.chirprc'))

    app_key = config.get('default', 'app_key')
    app_secret = config.get('default', 'app_secret')
    app_config = config.get('default', 'app_config')

    # ------------------------------------------------------------------------
    # Initialise the Connect SDK.
    # ------------------------------------------------------------------------
    sdk = ChirpConnect(app_key, app_secret, app_config)
    print(sdk.audio.query_devices())
    print(str(sdk))
    sdk.audio.input_device = args.i
    if args.network_config:
        sdk.set_config_from_network()

    # ------------------------------------------------------------------------
    # Set callbacks and start SDK
    # ------------------------------------------------------------------------
    sdk.set_callbacks(Callbacks(args))
    sdk.start(send=False, receive=True)

    try:
        # ------------------------------------------------------------------------
        # Process audio streams
        # ------------------------------------------------------------------------
        while True:
            time.sleep(0.1)

    except KeyboardInterrupt:
        print('Exiting')

    sdk.stop()
    sdk.close()


if __name__ == '__main__':
    # ------------------------------------------------------------------------
    # Parse command-line arguments.
    # ------------------------------------------------------------------------
    parser = argparse.ArgumentParser(
        description='Chirp Connect Listener',
        epilog='Listens for Chirp signals on the default system input'
    )
    parser.add_argument('-u', '--unicode', action='store_true', help='Parse payloads as unicode')
    parser.add_argument('-x', '--hex', action='store_true', help='Parse payloads as hexstrings')
    parser.add_argument('-i', type=int, default=None, help='Input device index (optional)')
    parser.add_argument('--network-config', action='store_true', help='Optionally download a config from the network')
    args = parser.parse_args()

    main(args)
