#!/usr/bin/env python3
import argparse
import os
from os import path
import shutil
import sys

import nib
from nib.config import default_config

if __name__ == '__main__':
    parser = argparse.ArgumentParser(description='Get more information at http://github.com/jreese/nib')
    subparsers = parser.add_subparsers(title='actions',
                                       dest='action')

    parser.add_argument('-V', '--version',
                        action='version',
                        version='%(prog)s ' + nib.version)
    parser.add_argument('-d', '--debug',
                        dest='debug',
                        action='store_true',
                        default=False,
                        help='debug output')
    parser.add_argument('-c', '--config',
                        dest='config',
                        metavar='FILE',
                        action='store',
                        default='config.nib',
                        help='site configuration file (default is config.nib)')

    build = subparsers.add_parser('build',
                                  help='generate site output (default action)')

    config = subparsers.add_parser('config',
                                   help='generate new site configuration')
    config.add_argument('-f', '--force',
                        dest='force',
                        action='store_true',
                        default=False,
                        help='overwrite existing configuration files')

    serve = subparsers.add_parser('serve',
                                   help='run a simple web server and open it in a browser')
    serve.add_argument('-p', '--port',
                       dest='port',
                       metavar='PORT',
                       action='store',
                       type=int,
                       default=8000,
                       help='port to run the local server on')
    serve.add_argument('-b', '--browse',
                       dest='browse',
                       action='store_true',
                       default=False,
                       help='open web browser to local server URL')

    wizard = subparsers.add_parser('wizard',
                                   help='interactively generate new site')

    help = subparsers.add_parser('help',
                                 help='show help message for a given command')
    help.add_argument('command',
                      nargs='?')


    options = parser.parse_args()

    try:
        if options.action == 'build' or options.action is None:
            nib.Build(nib.Config(options.config)).run()
            print('Done')

        elif options.action == 'config':
            if path.exists(options.config):
                if not options.force:
                    sys.stderr.write('Warning: "{}" already exists, use --force to overwrite\n'.format(options.config))
                    sys.exit(1)

                os.unlink(options.config)

            shutil.copyfile(default_config, options.config)
            print('Done')

        elif options.action == 'serve':
            config = nib.Config(options.config)

            cwd = path.abspath(os.getcwd())
            site_path = path.join(cwd, config['output_path'])

            if not path.exists(site_path):
                sys.stderr.write('Site not yet generated. Run `nib build` first.')
                sys.exit(1)

            os.chdir(site_path)

            if options.browse:
                pid = os.fork()
                if pid == 0:
                    import time
                    import webbrowser

                    time.sleep(1)

                    url = 'http://localhost:{}'.format(options.port)
                    print('Opening {} in web browser...'.format(url))
                    webbrowser.open(url)

                    sys.exit(0)

            try:
                from http.server import HTTPServer, SimpleHTTPRequestHandler
                server = HTTPServer(('', options.port), SimpleHTTPRequestHandler)

                print('Serving site on port {}... press Ctrl-C to terminate.'.format(options.port))
                server.serve_forever()

            except KeyboardInterrupt:
                print()
                pass

            print('Done')

        elif options.action == 'wizard':
            empty = True
            for dirpath, dirs, files in os.walk('.'):
                if len(dirs) > 0 or len(files) > 0:
                    empty = False
                    break

            overwrite = input('This directory is not empty, the wizard will overwrite existing files. Proceed? [y/N]: ')
            if not overwrite.lower().startswith('y'):
                sys.exit(1)

            config = nib.Config()

            print()
            print('-- Nib Wizard --')

            print()
            custom_config = input('Customize the default config? [Y/n]: ')
            if not custom_config.lower().startswith('n'):

                print()
                print('- Site Options -')
                print()

                site = config['site']

                site_title = input('Site title [{}]: '.format(site['title']))
                if site_title:
                    site['title'] = site_title

                site_tagline = input('Site tagline [{}]: '.format(site['tagline']))
                if site_tagline:
                    site['tagline'] = site_tagline

                site_uri = input('Site uri [{}]: '.format(site['uri']))
                if site_uri:
                    site['uri'] = site_uri

                site_root = input('Site root [{}]: '.format(site['root']))
                if site_root:
                    site['root'] = site_root

                site_author = input('Site author [{}]: '.format(site['author']))
                if site_author:
                    site['author'] = site_author
                    config['defaults']['author'] = site_author

                site_copyright = input('Site copyright [{}]: '.format(site['copyright']))
                if site_copyright:
                    site['copyright'] = site_copyright

                print()
                print('- Plugin Options -')
                print()

                enable_prettyurls = input('Enable pretty URLs? Uses Apache .htaccess [y/N]: ')
                if enable_prettyurls.lower().startswith('y'):
                    config['ignore_plugins'].remove('prettyurls')

                print()
                print('- Template Options -')
                print()

            copy_sample = input('Copy sample site templates? [Y/n]: ')
            if not copy_sample.lower().startswith('n'):
                shutil.unpack_archive(path.join(nib.cwd, 'sample.zip'), format='zip')

            nib.yaml.save('config.nib', config)
            print()
            print('Wizard complete.  Run `nib build` to generate site.')

        elif options.action == 'help':
            if options.command is None:
                parser.print_help()
                sys.exit(0)

            for command in subparsers.choices:
                if command == options.command:
                    subparsers.choices[command].print_help()
                    sys.exit(0)

            sys.stderr.write('No help available for command "{}"\n'.format(options.command))
            sys.exit(1)

    except Exception as e:
        if (options.debug):
            raise

        sys.stderr.write('Error: {}\n'.format(e))
        sys.exit(1)
