import os
import sys

import docing
import xmlxs
# import emeil

class Empro:

    def __init__(self, do_verbose=False, dasion=None):
        """finds and reads an email profile"""
        self.do_verbose = do_verbose
        if 'EMPROPATH' not in os.environ:
            self.path = None
            print("empro has no EMPROPATH", file=sys.stderr)
            sys.exit()
        path = os.environ['EMPROPATH']
        parts = path.split(':')
        fudis = []
        for part in parts:
            # # optionally allow for relative paths
            if not path.startswith('/') and 'HOME' in os.environ:
                part = os.environ['HOME'] + '/' + part
            if not os.path.isdir(part):
                print(f"empro does not see {part}", file=sys.stderr)
                continue
            fudis.append(part)
        if len(fudis) == 0:
            print("empro has no directories to search", file=sys.stderr)
            return
                ## allow for costum file extension
        self.ext = '.xslt.xml'
        # # date version. this is given at the module initializaton
        self.dasion  = dasion
        self.fudis = fudis
        if do_verbose:
            for fudi in fudis:
                print(f"empro looks in {fudi}")
        # # bari is barrier to the email
        self.ponens = ('head', 'text', 'html', 'bari')
        # # holder of the sheets
        self.sheets = {}
        # # holder for the sheet fufis. we need to keep them
        # # in case we need to transform via system command
        self.shifis = {}
        # # emnas we have gathered
        self.gathered = {}

    def bake(self, emna, doc, dasion=None):
        """<- emeil.py"""
        out = {}
        # # populates sheets and files
        gathered = self.gather(emna, dasion=dasion)
        if gathered is None:
            out['err'] = f'The empro for {emna} is not complete.'
            return out
        sheets = self.sheets[emna]
        shifis = self.shifis[emna]
        # # check the barrier, stop if it reports something
        if 'bari' in sheets:
            bari_doc = xmlxs.transform(sheets['bari'], doc,
                                       sheet_fufi=shifis['bari'])
            bari_text = str(bari_doc)
            if len(bari_text) > 0:
                out['log'] = str(bari_text)
                return out
        head_doc = xmlxs.transform(sheets['head'], doc,
                                   sheet_fufi=shifis['head'])
        # # a doc, not a string
        out['head'] = head_doc
        if 'text' in sheets:
            text = str(xmlxs.transform(sheets['text'], doc,
                                       sheet_fufi=shifis['text']))
            out['text'] = text
        else:
            out['text'] = None
        if 'html' in sheets:
            html = xmlxs.transform(sheets['html'], doc,
                                   sheet_fufi=shifis['html'])
            out['html'] = html
        else:
            out['html'] = None
        return out

    # # ponen are the components of an empro
    def get_ponen(self, fudi, emna, ponen, dasion=None):
        if emna not in self.shifis:
            self.shifis[emna] = {}
        # # already found?
        if ponen in self.shifis[emna]:
            return self.shifis[emna][ponen]
        base_fufi = f"{fudi}/{emna}_{ponen}{self.ext}"
        if dasion is None:
            if not os.path.isfile(base_fufi):
                return None
        else:
            dasion_fufi = f"{fudi}/{emna}_{ponen}_{dasion}{self.ext}"
        if dasion is not None and os.path.isfile(dasion_fufi):
            fufi = dasion_fufi
        else:
            fufi = base_fufi
        if not os.path.isfile(fufi):
            return None
        self.shifis[emna][ponen] = fufi

    def gather(self, emna, dasion=None):
        """gather all xslt files for an emna"""
        if emna not in self.shifis:
            self.shifis[emna] = {}
        if emna not in self.sheets:
            self.sheets[emna] = {}
        shifis = self.shifis[emna]
        for ponen in self.ponens:
            for fudi in self.fudis:
                self.get_ponen(fudi, emna, ponen, dasion=dasion)
        if 'head' not in shifis or \
           ('text' not in shifis and 'html' not in shifis):
            return None
        # # valid otherwise
        if emna not in self.sheets:
            self.sheets[emna] = {}
        for ponen in self.ponens:
            if ponen in self.sheets[emna]:
                continue
            if ponen not in self.shifis[emna]:
                continue
            if self.shifis[emna][ponen] is None:
                continue
            fufi = self.shifis[emna][ponen]
            self.sheets[emna][ponen] = xmlxs.get_sheet(fufi)
        return True
