#!/usr/bin/env python

import argparse
import getpass
import os
import socket
import sys

if os.getenv('FROM_SOURCE') is not None:
    sys.path.insert(0, '..')
    sys.path.insert(0, '.')

from pygenerator.project import Config, Project


def default_email():
    return '%s@%s' % (getpass.getuser(), socket.gethostname())


def build_config():
    parser = argparse.ArgumentParser()

    parser.add_argument(
        'project_name',
        type=str,
        help='The project name'
    )
    parser.add_argument(
        'packages',
        nargs='*',
        help='The packages to add (defaults to the project name)'
    )

    # override some defaults
    parser.add_argument(
        '--description',
        default='',
        type=str,
        help='What the project is about'
    )
    parser.add_argument(
        '--keywords',
        default='',
        type=str,
        help='Keywords to describe the project'
    )
    parser.add_argument(
        '--url',
        default='',
        help='URL of the project'
    )
    parser.add_argument(
        '--author',
        default=getpass.getuser(),
        help='The project author'
    )
    parser.add_argument(
        '--author-email',
        default=default_email(),
        help='The author\'s email'
    )
    parser.add_argument(
        '--license',
        default='apache',
        help='What license is the project under'
    )
    parser.add_argument(
        '--scripts',
        nargs='*',
        help='Scripts to be created under bin/'
    )
    parser.add_argument(
        '--requires',
        nargs='*',
        help='Runtime requirements for the project'
    )
    parser.add_argument(
        '--tests-requires',
        nargs='*',
        default=['nose'],
        help='Runtime requirements for tests'
    )
    parser.add_argument(
        '--extras-requires',
        nargs='*',
        help='Extra requirements'
    )
    parser.add_argument(
        '--version',
        type=str,
        default='0.0.1',
        help='The initial version declared in package/__init__.py'
    )
    parser.add_argument(
        '--overwrite',
        action='store_true',
        default=False,
        help='Overwrite existing files'
    )

    # what to include
    parser.add_argument(
        '--include-license',
        action='store_true',
        default=False,
        help='Exclude the LICENSE file'
    )

    # what to exclude
    parser.add_argument(
        '--exclude-tests',
        action='store_true',
        default=False,
        help='Exclude the tests package'
    )
    parser.add_argument(
        '--exclude-bin',
        action='store_true',
        default=False,
        help='Exclude the bin/ scripts directory'
    )
    parser.add_argument(
        '--exclude-readme',
        action='store_true',
        default=False,
        help='Exclude the README file'
    )
    parser.add_argument(
        '--exclude-contributing',
        action='store_true',
        default=False,
        help='Exclude the CONTRIBUTING file'
    )
    parser.add_argument(
        '--exclude-changes',
        action='store_true',
        default=False,
        help='Exclude the CHANGES file'
    )
    parser.add_argument(
        '--exclude-manifest',
        action='store_true',
        default=False,
        help='Exclude the MANIFEST.in file for non-source files declaration'
    )
    parser.add_argument(
        '--exclude-requirements',
        action='store_true',
        default=False,
        help='Exclude the requirements.txt file'
    )

    # general options
    parser.add_argument(
        '--quiet',
        action='store_true',
        default=False,
        help='Don\'t print out what\'s being created'
    )

    params = parser.parse_args()

    config = Config(
        params.project_name,
        params.description,
        params.keywords,
        params.url,
        params.author,
        params.author_email,
        params.license,
        params.scripts or [],
        params.requires or [],
        params.tests_requires or [],
        params.extras_requires or [],
        [params.project_name] if not len(params.packages) else params.packages,
        version=params.version,
        include_license=params.include_license,
        include_tests=not params.exclude_tests,
        include_bin=not params.exclude_bin,
        include_readme=not params.exclude_readme,
        include_contributing=not params.exclude_contributing,
        include_changes=not params.exclude_changes,
        include_manifest=not params.exclude_manifest,
        include_requirements=not params.exclude_requirements,
        overwrite=not params.overwrite
    )

    return (params.quiet, config)


if __name__ == '__main__':
    quiet, config = build_config()
    project = Project(config)
    project.create(verbose=not quiet)
