#!python
from __future__ import print_function

import os
import argparse
import subprocess
import mkrst_themes

THEMES_DIR=os.path.dirname(mkrst_themes.__file__)
THEME="default"
SUPPORTED_FORMATS = 'html pdf odt'.split()

DEBUG='DEBUG' in os.environ

class CommandExecutor:

    GENERAL_OPTIONS = ['--syntax-highlight=short', '--smart-quotes=yes']

    def __init__(self, opts):
        self._src = opts.input
        self._verbose = opts.verbose

    def set_theme(self, path, name):
        self.theme_dir = os.path.join(path, name)
        print('Using %s'%self.theme_dir)

    def _list_resources(self, origin, extension):
        r = []
        for fname in os.listdir(os.path.join(self.theme_dir, origin)):
            if fname.endswith(extension):
                r.append(os.path.join(self.theme_dir, origin, fname))
        r.sort()
        if DEBUG:
            print('List(*%s) = %s'%(extension, ', '.join(r)))
        return r

    def get_output(self, fmt):
        return self._src.rsplit('.', 1)[0] + '.' + fmt

    def __execute(self, args):
        if DEBUG:
            print("Executing %s"% " ".join(args))
        proc = subprocess.Popen(args, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        out, err = proc.communicate()

        def show_result():
            print('\nStdout:')
            print(out.decode('utf-8').strip())
            print('\nStderr:')
            print(err.decode('utf-8').strip())

        if proc.returncode == 0:
            if self._verbose:
                show_result()
            return (out, err)
        else:
            print(' PROBLEM! '.center(80, '#'))
            show_result()

    def make_pdf(self):
        out = self.get_output('pdf')
        opts = [o for o in self.GENERAL_OPTIONS if 'syntax' not in o]
        args = ['rst2pdf', '--real-footnotes'] + opts
        for style in self._list_resources('pdf', '.style'):
            args.extend(('-s', style))
        args.extend(('-o', out, self._src))
        if self.__execute(args):
            print(out)

    def make_odt(self):
        out = self.get_output('odt')
        css = self._list_resources('odt', 'odt')[0]
        args = ['rst2odt' ] + self.GENERAL_OPTIONS + ['--add-syntax-highlighting', '--stylesheet', css, self._src, out]
        if self.__execute(args):
            print(out)

    def make_html(self):
        out = self.get_output('html')
        css = ','.join(self._list_resources('html', 'css'))
        args = ['rst2html' ] + self.GENERAL_OPTIONS + ['--embed-stylesheet', '--stylesheet-path', css, self._src, out]
        if self.__execute(args):
            print(out)
        # post process
        links = os.path.join(self.theme_dir, 'html', 'links.html')
        if os.path.exists(links):
            data = open(out).read()
            data = data.replace('<html>', '<html>\n'+open(links).read())
            open(out, 'w').write(data)


if __name__ == '__main__':
    parser = argparse.ArgumentParser()

    parser.add_argument('-v', '--verbose', action='store_true',
            help="Display commands' output")

    parser.add_argument('input', type=str, metavar='FILE',
            help='The .rst or .txt file to convert')

    for fmt in SUPPORTED_FORMATS:
        parser.add_argument('--%s'%fmt,action='store_true',
                help='Generate %s output'%fmt.upper())


    parser.add_argument('--theme', type=str, default=THEME,
            help='Use a different theme')

    parser.add_argument('--themes-dir', type=str, default=THEMES_DIR,
            help='Change the folder searched for theme')

    args = parser.parse_args()

    cmd = CommandExecutor(args)
    cmd.set_theme(args.themes_dir, args.theme)

    if not any(getattr(args, fmt) for fmt in SUPPORTED_FORMATS):
        print("No action ! Give one or more --(%s)"%'|'.join( SUPPORTED_FORMATS))
    else:
        for fmt in SUPPORTED_FORMATS:
            if getattr(args, fmt):
                fn = getattr(cmd, 'make_%s'%fmt)
                print(" %5s:  "%fmt, end='')
                fn()

