#!/usr/bin/env python3

"""MDT - The Mendel Development Tool

This is the main CLI dispatch routine that teases out the command line and runs
the appropriate command.


Copyright 2019 Google LLC

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

    https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
"""

import socket
import sys

try:
    import paramiko
    import zeroconf
except ImportError:
    sys.stderr.write("Couldn't load paramiko or zeroconf -- "
                     "perhaps you need to install them?\r\n")
    sys.stderr.write("On Debian derivatives, 'apt-get install "
                     "python3-paramiko python3-zeroconf'.\r\n")
    sys.exit(1)

from mdt import config
from mdt import devices
from mdt import files
from mdt import keys
from mdt import shell


MDT_USAGE_HELP = '''
Usage: mdt <subcommand> [<options>]

Where <subcommand> may be one of the following:
    help              - this command, gets help on another command.
    devices           - lists all detected devices.
    wait-for-device   - waits for a device to be discovered on the network
    get               - gets an MDT variable value
    set               - sets an MDT variable value
    clear             - clears an MDT variable
    genkey            - generates an SSH key for connecting to a device
    pushkey           - pushes an SSH public key to a device
    setkey            - imports a PEM-format SSH private key into the MDT
                        keystore
    shell             - opens an interactive shell to a device
    exec              - runs a shell command and returns the output and the
                        exit code
    install           - installs a Debian package using mdt-install-package on
                        the device
    push              - pushes a file (or files) to the device
    pull              - pulls a file (or files) from the device
    reboot            - reboots a device
    reboot-bootloader - reboots a device into the bootloader

Use "mdt help <subcommand>" for more details.
'''


class HelpCommand:
    '''Usage: mdt help [<subcommand>]

Gets additional information about a given subcommand, or returns a summary
of subcommands available.
'''

    def run(self, args):
        if len(args) <= 1:
            print(MDT_USAGE_HELP)
            return 1

        subcommand = args[1].lower()
        command = COMMANDS[subcommand]
        if command.__doc__:
            print(command.__doc__)
        else:
            print("No help is available for subcommand '{0}' "
                  "-- please yell at the developers. :)".format(subcommand))


COMMANDS = {
    'clear': config.ClearCommand(),
    'devices': devices.DevicesCommand(),
    'exec': shell.ExecCommand(),
    'genkey': keys.GenKeyCommand(),
    'get': config.GetCommand(),
    'help': HelpCommand(),
    'install': files.InstallCommand(),
    'pull': files.PullCommand(),
    'push': files.PushCommand(),
    'pushkey': shell.PushKeyCommand(),
    'reboot': shell.RebootCommand(),
    'reboot-bootloader': shell.RebootBootloaderCommand(),
    'set': config.SetCommand(),
    'setkey': keys.SetKeyCommand(),
    'shell': shell.ShellCommand(),
    'wait-for-device': devices.DevicesWaitCommand(),
}


def main():
    try:
        if len(sys.argv) <= 1:
            exit(COMMANDS['help'].run([]))
        else:
            command = sys.argv[1].lower()

        if command == '--help':
            command = 'help'

        if command in COMMANDS:
            command = COMMANDS[command]
            exit(command.run(sys.argv[1:]))

        print("Unknown command '{0}': try 'mdt help'".format(command))
        return 1

    except KeyboardInterrupt:
        print()
        exit(1)


if __name__ == '__main__':
    main()
