#!python
import tarfile
import os
import sys
import json
import argparse
from gpi.installer import install, uninstall
from gpi.web import get_from_web, PackageNotFound, PackageReadError

parser = argparse.ArgumentParser(
    usage="\n"
    "       gpi install [package]\n"
    "       gpi install -f [file]\n"
    "       gpi uninstall [package]")

parser.add_argument('command', nargs='+')
parser.add_argument("-f", "--file", help="install from file", default=False,
                    action="store")
args = parser.parse_args()

if args.file and args.command[0] != "install":
    exit("Cannot uninstall from a file!")

if args.file and len(args.command) > 1:
    exit("Specify either a file or a package name!")

if len(args.command) < 2 and not args.file:
    exit("Usage: gpi [command] [package]")


def main():
    if args.command[0] == "install":
        if args.file:
            if not tarfile.is_tarfile(args.file):
                exit("File must be a tarfile!")
            t = tarfile.open(args.file, 'r')
            print("Installing {}".format(args.file))
        else:
            try:
                t = get_from_web(args.command[1])
            except PackageNotFound:
                exit("{} was not found".format(args.command[1]))
            except PackageReadError as e:
                exit("{} could not be read.".format(str(e)))

        manifest = json.load(t.extractfile('gpi.json'))
        print("Installing version " + manifest['version'])
        install(t, manifest)
        print("{} {} installed successfully!".format(
            manifest['name'], manifest['version']))

    elif args.command[0] == "uninstall":
        uninstall_successful = uninstall(args.command[1])
        if uninstall_successful:
            print("{} uninstalled successfully!".format(args.command[1]))
        else:
            print("Could not uninstall {}!".format(args.command[1]))

if __name__ == "__main__":
    sys.path.append(
        os.path.dirname(os.path.dirname(os.path.abspath(__file__))))
    main()
