#!/usr/bin/env python

import argparse

import peachtree


def main():
    parser = argparse.ArgumentParser()
    subparsers = parser.add_subparsers()
    
    for command_name, command_builder in _commands.iteritems():
        command = command_builder()
        subparser = subparsers.add_parser(command_name)
        subparser.set_defaults(func=command.execute)
        command.create_parser(subparser)
    
    args = parser.parse_args()
    provider_name = "qemu"
    if provider_name in peachtree.providers:
        args.func(peachtree.providers[provider_name](), args)
    else:
        print "Unrecognised provider:", provider_name
        exit(1)


class RunCommand(object):
    def create_parser(self, subparser):
        subparser.add_argument('image')
    
    def execute(self, provider, args):
        machine = provider.start(args.image)
        print "identifier", machine.identifier
        ssh_config = machine.ssh_config()
        print "== SSH config =="
        print "HostName", ssh_config.hostname
        print "User", ssh_config.user
        print "Port", ssh_config.port
        print "Password", ssh_config.password


class ListCommand(object):
    def create_parser(self, subparser):
        pass
    
    def execute(self, provider, args):
        machines = provider.list_running_machines()
        for machine in machines:
            print machine.identifier, machine.image_name
            
            
class StopCommand(object):
    def create_parser(self, subparser):
        subparser.add_argument('identifier')
    
    def execute(self, provider, args):
        machine = provider.find_running_machine(args.identifier)
        machine.destroy()
        
            
class CronCommand(object):
    def create_parser(self, subparser):
        pass
    
    def execute(self, provider, args):
        provider.cron()
    
        
_commands = {
    "run": RunCommand,
    "list-running": ListCommand,
    "stop": StopCommand,
    "cron": CronCommand,
}

if __name__ == "__main__":
    main()
