#! /usr/bin/env python
"""
python -m holoviews.util.command Conversion_Example.ipynb
OR
holoviews Conversion_Example.ipynb
"""

from __future__ import absolute_import, print_function

import sys
import os
import argparse
from argparse import RawTextHelpFormatter

try:
    import nbformat, nbconvert
except:
    print('nbformat, nbconvert and ipython need to be installed to use the holoviews command')
    sys.exit()
try:
    from ..ipython.preprocessors import OptsMagicProcessor, OutputMagicProcessor
    from ..ipython.preprocessors import StripMagicsProcessor
except:
    from holoviews.ipython.preprocessors import OptsMagicProcessor, OutputMagicProcessor
    from holoviews.ipython.preprocessors import StripMagicsProcessor

from . import examples


def main():
    if len(sys.argv) < 2:
        print("For help with the holoviews command run:\n\nholoviews --help\n")
        sys.exit()

    parser = argparse.ArgumentParser(prog='holoviews',
                                     formatter_class=RawTextHelpFormatter,
                                     description=description,
                                     epilog=epilog)

    parser.add_argument('--notebook', metavar='notebook', type=str, nargs=1,
                    help='The Jupyter notebook to convert to Python syntax.')

    parser.add_argument('--install-examples', metavar='install_examples',
                        type=str, nargs='?',
                        help='Install examples to the specified directory.')

    args = parser.parse_args()
    if args.notebook:
        print(export_to_python(args.notebook[0]), file=sys.stdout)
    else:
        if args.install_examples is None:
            examples_dir = 'holoviews-examples'
        else:
            examples_dir = args.install_examples
        curdir,_ = os.path.split(__file__)
        root = os.path.abspath(os.path.join('..','..', curdir))
        examples(path=examples_dir, root=root)


def export_to_python(filename=None,
         preprocessors=[OptsMagicProcessor(),
                        OutputMagicProcessor(),
                        StripMagicsProcessor()]):

    filename = filename if filename else sys.argv[1]
    with open(filename) as f:
        nb = nbformat.read(f, nbformat.NO_CONVERT)
        exporter = nbconvert.PythonExporter()
        for preprocessor in preprocessors:
            exporter.register_preprocessor(preprocessor)
        source, meta = exporter.from_notebook_node(nb)
        return source



description = """
Command line interface for holoviews.

This utility allows conversion of notebooks containing the HoloViews
%opts, %%opts, %output and %%output magics to regular Python
syntax. This is useful for turning Jupyter notebooks using HoloViews
into Bokeh applications that can be served with:

bokeh server --show converted_notebook.py

The holoviews command supports the following options:
"""

epilog="""
Example usage
-------------

$ holoviews ./examples/demos/matplotlib/area_chart.ipynb

The converted syntax is then output to standard output where you can
direct it to a Python file of your choosing.
"""


if __name__ == '__main__':
    main()
