from django.db import models
from django.contrib.sitemaps import Sitemap
import markdown


import os
import yaml
from django.conf import settings
from django.template.loader import render_to_string
from django.template import Context
from mdx_attr_list.mdx_attr_list import AttrListExtension


def markdown_processor(txt):
    md = markdown.Markdown(
        extensions=[AttrListExtension(),'footnotes',],
        output_format='html5',
        safe_mode=False
    )
    return md.convert(txt)
'''
class Page(models.Model):
    title = models.CharField(max_length=200)
    slug = models.SlugField()
    body_html = models.TextField(blank=True)
    body_markdown = models.TextField()
    meta_description = models.CharField(max_length=256, null=True, blank=True)

    def __unicode__(self):
        return self.title

    def get_absolute_url(self):
        return "/%s/" % (self.slug)

    def save(self):
        #run markdown
        self.body_html = markdown_processor(self.body_markdown)
        super(Page, self).save()
'''

class PageSitemap(Sitemap):
    changefreq = "never"
    priority = 1.0
    protocol = "https"

    def items(self):
        p = PageGenerator(settings.PROJ_ROOT + '_pages')
        return p.objects(include_in_sitemap=True)
        #return Page.objects.all()


class PageGenerator(object):

    def __init__(self, path, *args, **kwargs):
        self._objects = []
        for (dirpath, dirnames, filenames) in os.walk(path):
            self.dirpath = dirpath
            self.file_list = filter(lambda item: not (item.startswith('.') or item.endswith('~') or item.endswith('.md')), filenames)
            self.get_files()

    def get_files(self):
        for f in self.file_list:
            p = Page(self.dirpath + '/' + f)
            self._objects.append(p)

    def objects(self, *args, **kwargs):
        filtered_list = []
        if kwargs:
            for item in self._objects:
                found = False
                for k, v in kwargs.items():
                    if getattr(item, k) == v and not found:
                        found = True
                        filtered_list.append(item)
                    elif getattr(item, k) != v and found:
                        filtered_list.remove(item)
            return filtered_list
        return self._objects

    def write_files(self):
        for obj in self.objects():
            c = Context({'object': obj, 'SITE_URL': settings.SITE_URL})
            t = render_to_string(["details/%s.html" % obj.template], c)
            s = render_to_string('details/page.txt', c)
            _FileWriter('', t, ext="html", filename=obj.slug)
            _FileWriter('', s, ext="txt", filename=obj.slug)


class _FileWriter(object):
    """
    Given a path and text object; write the page to disc
    """
    def __init__(self, path, text_object, ext='html', filename='index'):
        self.path = '%s%s' % (settings.FLATFILES_ROOT, path)
        if not os.path.isdir(self.path):
            os.makedirs(self.path)
        fpath = '%s%s.%s' % (self.path, filename, ext)
        self.write(fpath, text_object)

    def write(self, fpath, text_object):
        file = open(fpath, 'wb')
        file.write(text_object.encode('utf-8'))
        file.close()


class _FileLoader(object):

    def __init__(self, filename, *args, **kwargs):
        self.filename = filename
        metadata = self.read()
        for k, v in metadata.items():
            setattr(self, k, v)
        if self.body_markdown:
            self.body_html = markdown_processor(self.body_markdown)

    def read(self):
        with open(self.filename, "r", encoding="utf-8") as f:
            contents = f.read()
        metayaml, self.body_markdown = contents.split('\n---')
        return yaml.load(metayaml)

class Page(_FileLoader):
    pass