#!/usr/bin/env python
# --!-- coding: utf8 --!--
import os
import shutil
import subprocess

from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import qApp, QMessageBox
from PyQt5.QtGui import QCursor

from manuskript.converters import abstractConverter
from manuskript.functions import mainWindow, safeTranslate

import logging
LOGGER = logging.getLogger(__name__)

class pandocConverter(abstractConverter):

    name = "pandoc"
    cmd = "pandoc"

    @classmethod
    def isValid(self):
        if self.path() != None:
            return 2
        elif self.customPath() and os.path.exists(self.customPath):
            return 1
        else:
            return 0

    @classmethod
    def customPath(self):
        settings = QSettings()
        return settings.value("Exporters/{}_customPath".format(self.name), "")

    @classmethod
    def path(self):
        return shutil.which(self.cmd)

    @classmethod
    def convert(self, src, _from="markdown", to="html", args=None, outputfile=None):
        if not self.isValid:
            LOGGER.error("pandocConverter is called but not valid.")
            return ""

        cmd = [self.runCmd()]

        cmd += ["--from={}".format(_from)]
        cmd += ["--to={}".format(to)]

        if args:
            cmd += args

        if outputfile:
            cmd.append("--output={}".format(outputfile))

        qApp.setOverrideCursor(QCursor(Qt.WaitCursor))

        p = subprocess.Popen(
            cmd,
            stdin=subprocess.PIPE,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE
        )

        if not type(src) == bytes:
            src = src.encode("utf-8")  # assumes utf-8

        stdout, stderr = p.communicate(src)

        qApp.restoreOverrideCursor()

        if stderr:
            err = stderr.decode("utf-8")
            LOGGER.error(err)
            QMessageBox.critical(mainWindow().dialog,
                                 safeTranslate(qApp, "Export", "Error"), err)
            return None

        return stdout.decode("utf-8")

    @classmethod
    def runCmd(self):
        if self.isValid() == 2:
            return self.cmd
        elif self.isValid() == 1:
            return self.customPath
