#!/usr/bin/env python3
# SPDX-License-Identifier: GPL-3.0-or-later
# Copyright (C) 2018 Takashi Sakamoto

from hinawa_utils.misc.cui_kit import CuiKit
from hinawa_utils.oxfw.tascam_fireone import TascamFireone

# Helper functions
def handle_current_status(unit, args):
    print('Current status:')
    print('  Packet Streaming:')
    print('    running:          {0}'.format(unit.get_property('streaming')))
    fmts = unit.get_current_stream_formats()
    print('    sampling-rate:    {0}'.format(fmts['playback']['sampling-rate']))
    print('  Control surface:')
    print('    display-mode:     {0}'.format(unit.display_get_mode()))
    print('    control-mode:     {0}'.format(unit.control_get_mode()))
    print('    input-mode:       {0}'.format(unit.input_get_mode()))
    print('ASIC information:')
    print('  type:             {0}'.format(unit.hw_info['asic-type']))
    print('  ID:               {0}'.format(unit.hw_info['asic-id']))
    print('  firmware version: {0}'.format(unit.hw_info['firmware-version']))
    print('TASCAM firmware information:')
    print('  version:          {0}'.format(unit.firmware_get_version()))
    return True

def handle_display_mode(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            mode = args[1]
            unit.display_set_mode(mode)
        else:
            print(unit.display_get_mode())
        return True
    print('Arguments for display-mode command:')
    print('  display-mode OPERATION [MODE]')
    print('    OPERATION: {0}'.format(', '.join(ops)))
    print('    MODE:     {0}'.format(', '.join(unit.display_modes)))
    return False

def handle_control_mode(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            mode = args[1]
            unit.control_set_mode(mode)
        else:
            print(unit.control_get_mode())
        return True
    print('Arguments for control-mode command:')
    print('  control-mode OPERATION [MODE]')
    print('    OPERATION: {0}'.format(', '.join(ops)))
    print('    MODE:     {0}'.format(', '.join(unit.control_modes)))
    return False

def handle_input_mode(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            mode = args[1]
            unit.input_set_mode(mode)
        else:
            print(unit.input_get_mode())
        return True
    print('Arguments for input-mode command:')
    print('  input-mode OPERATION [MODE]')
    print('    OPERATION: {0}'.format(', '.join(ops)))
    print('    MODE:     {0}'.format(', '.join(unit.input_modes)))
    return False

def handle_sampling_rate(unit, args):
    ops = ('set', 'get')
    if len(args) > 0 and args[0] in ops:
        op = args[0]
        if op == ops[0] and len(args) == 2:
            if unit.get_property('streaming'):
                print('Packet streaming started.')
                return False
            rate = int(args[1])
            for fmt in unit.supported_stream_formats['playback']:
                if fmt['sampling-rate'] == rate:
                    playback = fmt
                    break
            else:
                print('Invalid argument for sampling rate')
                return False
            for fmt in unit.supported_stream_formats['capture']:
                if fmt['sampling-rate'] == rate:
                    capture = fmt
                    break
            else:
                print('Invalid argument for sampling rate')
                return False
            unit.set_stream_formats(playback, capture)
        else:
            fmts = unit.get_current_stream_formats()
            print(fmts['playback']['sampling-rate'])
        return True
    print('Arguments for sampling-rate command:')
    print('  input-mode OPERATION [RATE]')
    print('    OPERATION: {0}'.format(', '.join(ops)))
    fmts = unit.supported_stream_formats['playback']
    rates = [str(fmt['sampling-rate']) for fmt in fmts]
    print('    MODE:     {0}'.format(', '.join(rates)))
    return True

cmds = {
    'current-status':   handle_current_status,
    'display-mode':     handle_display_mode,
    'control-mode':     handle_control_mode,
    'input-mode':       handle_input_mode,
    'sampling-rate':    handle_sampling_rate,
}

fullpath = CuiKit.seek_snd_unit_path()
if fullpath:
    unit = TascamFireone(fullpath)
    CuiKit.dispatch_command(unit, cmds)
