#!/usr/bin/env python
# encoding: utf-8

from glob import glob
import os

from .template import Template
from .text_exporter import TextExporter


class GenericTemplateExporter(TextExporter):
    """This Exporter can convert entries and journals into text files."""

    @classmethod
    def export_entry(cls, entry):
        """Returns a string representation of a single entry."""
        vars = {"entry": entry, "tags": entry.tags}
        return cls.template.render_block("entry", **vars)

    @classmethod
    def export_journal(cls, journal):
        """Returns a string representation of an entire journal."""
        vars = {"journal": journal, "entries": journal.entries, "tags": journal.tags}
        return cls.template.render_block("journal", **vars)


def __exporter_from_file(template_file):
    """Create a template class from a file"""
    name = os.path.basename(template_file).replace(".template", "")
    template = Template.from_file(template_file)
    return type(
        str(f"{name.title()}Exporter"),
        (GenericTemplateExporter,),
        {"names": [name], "extension": template.extension, "template": template},
    )


__all__ = []

# Factory pattern to create Exporter classes for all available templates
for template_file in glob("jrnl/templates/*.template"):
    __all__.append(__exporter_from_file(template_file))
