#!python
import argparse
import os
import kpm.registry as registry
from kpm.registry import Registry
from kpm.packager import *
import kpm.manifest
from kpm.kub import Kub
from kpm.new import new_package
import yaml

def new(options):
    new_package(options.package[0], options.dest, options.with_comments)

def show(options):
    k = Kub(options.package[0], endpoint=options.registry_host)
    print k.package.manifest

def pack(options):
    m = kpm.manifest.Manifest(path=".")
    kubpath = os.path.join(options.dest, m.package_name())
    pack_kub(kubpath)
    return (m, kubpath)

def install(options):
    k = Kub(options.package[0], endpoint=options.registry_host)
    if options.namespace is not None:
        k.variables["namespace"] = options.namespace
    if options.replicas is not None:
        k.variables["replicas"] = options.replicas
    k.install(dest=options.dest, namespace=options.namespace, force=options.force, dry=options.dry_run)

def unpack(options):
    unpack_kub(options.package[0], options.dest)

def pull(options):
    r = Registry(options.registry_host)
    result = r.pull(options.package[0])
    p = Package(result['blob'])
    path = kpm.manifest.Manifest(p).package_name()
    p.pack(path)

def push(options):
   r = Registry(options.registry_host)
   manifest, kubpath = pack(options)
   f = open(kubpath, 'r')
   r.push({"name": manifest.package['name'],
                  "author": manifest.package['author'],
                  "version": manifest.package['version'],
                  "blob": f.read()}, options.force)



if __name__ == "__main__":


    parser = argparse.ArgumentParser()

    # Global arguments

    parser.add_argument("--namespace",
                        help="namespace to deploy the application")


    subparsers = parser.add_subparsers(help='command help')

    # PUSH
    push_parser = subparsers.add_parser('push', help='push a new package')
    push_parser.add_argument("-d", "--dest", nargs="?", default=".",
                               help="destionation directory")

    push_parser.add_argument("-H", "--registry-host", nargs="?", default=registry.DEFAULT_REGISTRY,
                             help="registry endpoint")
    push_parser.add_argument("--force", action='store_true', default=False,
                                help="force push the package")

    push_parser.set_defaults(func=push)

    # PULL
    pull_parser = subparsers.add_parser('pull', help='pull a package')
    pull_parser.add_argument('package', nargs=1, help="package-name")
    pull_parser.add_argument("-H", "--registry-host", nargs="?", default=registry.DEFAULT_REGISTRY,
                            help="registry endpoint")
    pull_parser.add_argument("-d", "--dest", nargs="?", default="/tmp/",
                        help="destionation directory")
    pull_parser.set_defaults(func=pull)

    # Pack
    pack_parser = subparsers.add_parser('pack', help='pack a package')
    pack_parser.add_argument("-d", "--dest", nargs="?", default=".",
                               help="destionation directory")
    pack_parser.set_defaults(func=pack)

    # Show
    show_parser = subparsers.add_parser('show', help='show a package')
    show_parser.add_argument('package', nargs=1, help="package-name")
    show_parser.add_argument("-H", "--registry-host", nargs="?", default=registry.DEFAULT_REGISTRY,
                                help="registry endpoint")

    show_parser.set_defaults(func=show)

    # new
    new_parser = subparsers.add_parser('new', help='initiate a new package')
    new_parser.add_argument('package', nargs=1, help="package-name")
    new_parser.add_argument("-d", "--dest", nargs="?", default=".",
                               help="destionation directory")
    new_parser.add_argument("--with-comments", action='store_true', default=False,
                                help="Add 'help' comments to manifest")

    new_parser.set_defaults(func=new)

    # Unpack
    unpack_parser = subparsers.add_parser('unpack', help='unpack a unpackage')
    unpack_parser.add_argument('package', nargs=1, help="package-name")
    unpack_parser.add_argument("-d", "--dest", nargs="?", default="/tmp/",
                        help="destionation directory")
    unpack_parser.set_defaults(func=unpack)

    # Install
    install_parser = subparsers.add_parser('install', help='install a package')
    install_parser.add_argument('package', nargs=1, help="package-name")
    install_parser.add_argument("-d", "--dest", nargs="?", default="/tmp/",
                                help="destionation directory for resources")
    install_parser.add_argument("--dry-run", action='store_true', default=False,
                                help="do not create the resources")
    install_parser.add_argument("--namespace", nargs="?",
                                help="namespace", default=None)
    install_parser.add_argument("--replicas", nargs="?",
                                help="replicas", default=None)

    install_parser.add_argument("--force", action='store_true', default=False,
                                help="force upgrade")
    install_parser.add_argument("-H", "--registry-host", nargs="?", default=registry.DEFAULT_REGISTRY,
                             help="registry endpoint")


    install_parser.set_defaults(func=install)


    args = parser.parse_args()
    args.func(args)
