#!/usr/bin/env python
###############################################################################

__maintainer__ = "Alex Chklovski"
__email__ = "chklovski near gmail.com"

import argparse
from argparse import RawTextHelpFormatter
import sys
import os
import logging

sys.path = [os.path.join(os.path.dirname(os.path.realpath(__file__)),'..')] + sys.path

import zenodo_backpack



if __name__ == '__main__':

    parent_parser = argparse.ArgumentParser(add_help=False)
    parent_parser.add_argument('--debug', help='output debug information', action="store_true")
    parent_parser.add_argument('--version', help='output version information and quit',  action='version', version=zenodo_backpack.__version__)
    parent_parser.add_argument('--quiet', help='only output errors', action="store_true")

    parser = argparse.ArgumentParser(parents=[parent_parser])
    subparsers = parser.add_subparsers(title="Sub-commands", dest='subparser_name', parser_class=argparse.ArgumentParser)
    subparser_name_to_parser = {}

    def new_subparser(subparsers, parser_name, parser_description):
        subpar = subparsers.add_parser(parser_name,
                                       description=parser_description,
                                       help=parser_description,
                                       formatter_class=RawTextHelpFormatter,
                                       parents=[parent_parser])
        subparser_name_to_parser[parser_name] = subpar
        return subpar

    create_description = 'Creates a zenodo_backpack archive from target directory, resulting in a .tar.gz ' \
                         'file with checksum information. The archive be uploaded to Zenodo and downloaded by zenodo_backpack in the future\n\n' \
                         'Note that a version of your data must be provided, and the SAME version must be specified in Zenodo metadata.\n\n' \
                         '\t\tExample use: zenodo_backpack create --input_directory <./INPUT_DIRECTORY> --data_version <VERSION> --output_file <./ARCHIVE.tar.gz> '

    download_description = 'Given a DOI, downloads file from Zenodo and extracts it to output_directory. ' \
                           'Must point to a DOI containing a zenodo_backpack-created archive.\n\n' \
                           '\t\tExample use: zenodo_backpack download --doi <DOI> --output_directory <OUTPUT_DIRECTORY> --bar'


    create_parser = new_subparser(subparsers, 'create', create_description)

    create_arguments = create_parser.add_argument_group('required arguments')

    create_arguments.add_argument('--input_directory', '--input-directory', '-i', help="Path to folder to be archived.", required=True)
    create_arguments.add_argument('--output_file', '--output-file', '-o', help="Path to output file in the format *.tar.gz", required=True)
    create_arguments.add_argument('--data_version', '--data-version', help="Version of data to be archived. Must correspond to version specified in Zenodo metadata.", required=True)

    create_arguments = create_parser.add_argument_group('additional arguments')
    create_arguments.add_argument('--force', action='store_true', help='Overwrite output file if exists [default: do not overwrite]', default=False)


    download_parser = new_subparser(subparsers, 'download', download_description)

    download_arguments = download_parser.add_argument_group('required arguments')

    download_arguments.add_argument('--doi', help="DOI of Zenodo record.", required=True)
    download_arguments.add_argument('--output_directory', '--output-directory', '-o', help="Location to which Zenodo archive is to be downloaded.", required=True)


    download_arguments = download_parser.add_argument_group('additional arguments')
    download_arguments.add_argument('--bar', help="Show graphical progress bar for download. Default: [do not show]",
                                  action='store_true', default=False)

    download_arguments.add_argument('--no_check_version', '--no-check-version', help="Do not verify version specified in CONTENTS.json in archive matches official Zenodo record. Default: [Verify]",
                                  action='store_true', default=False)


    if (len(sys.argv) == 1 or sys.argv[1] == '-h' or sys.argv[1] == '--help' or sys.argv[1] == 'help'):
        print('\n                ...::: zenodo_backpack ' + zenodo_backpack.__version__ + ' :::...''')
        print('\n\n  General usage:')
        print('    zenodo_backpack create         -> %s' % 'Creates a *.tar.gz zenodo_backpack archive from target directory')
        print('    zenodo_backpack download       -> %s' % 'Given a DOI, downloads file from Zenodo and extracts it to output_directory.')
        print('\n\n  Use zenodo_backpack <command> -h for command-specific help.\n')
        sys.exit(0)

    else:
        args = parser.parse_args()

    if args.debug:
        loglevel = logging.DEBUG
    elif args.quiet:
        loglevel = logging.ERROR
    else:
        loglevel = logging.INFO

    logging.basicConfig(level=loglevel, 
        format='[%(asctime)s] %(levelname)s: %(message)s',
        datefmt='%m/%d/%Y %I:%M:%S %p')
    logging.info("Zenodo Backpack v{}".format(zenodo_backpack.__version__))

    if args.subparser_name == 'create':
        backpackCreator = zenodo_backpack.ZenodoBackpackCreator()
        backpackCreator.create(args.input_directory, args.output_file, args.data_version, args.force)

    elif args.subparser_name == 'download':
        backpackDownloader = zenodo_backpack.ZenodoBackpackDownloader()
        backpackDownloader.download_and_extract(args.output_directory, args.doi, not args.no_check_version, args.bar)


