import os
import datetime
import xml
from dynastie.generators.generator import DynastieGenerator
from xml.dom.minidom import getDOMImplementation
from django.db import models

class RSS(DynastieGenerator):

    def appendElement(self, dom, root, name='', content='', attributes=None):
        elem = dom.createElement(name)
        if not attributes is None:
            for k, v in attributes.iteritems():
                elem.setAttribute(k, v)
        if content != '':
            elem.appendChild(dom.createTextNode(content))
        root.appendChild(elem)
        return elem

    def generate(self, blog, src, output):
        from dynastie.models import Post, Blog

        now = datetime.datetime.now()

        impl = getDOMImplementation()

        dom = impl.createDocument(None, "rss", None)
        root = dom.documentElement
        root.setAttribute('version', '2.0')
        root.setAttributeNS('xmlns', 'xmlns:atom', 'http://www.w3.org/2005/Atom')
        channel = dom.createElement('channel')
        root.appendChild(channel)

        self.appendElement(dom, channel, 'title', blog.title)
        self.appendElement(dom, channel, 'description', blog.description)
        self.appendElement(dom, channel, 'link', 'http://' + blog.name)

        builddate = now.strftime('%a, %d %b %Y %H:%M:%S')
        self.appendElement(dom, channel, 'lastBuildDate', builddate)
        self.appendElement(dom, channel, 'generator', 'Dynastie')
        self.appendElement(dom, channel, 'language', 'en-gb')
        
        posts = Post.objects.filter(published=True).order_by('-modification_date')[:10]

        for post in posts:
            item = dom.createElement('item')
            self.appendElement(dom, item, 'title', post.title)
            path = 'http://' + blog.name + post.getPath()
            self.appendElement(dom, item, 'link', path)
            self.appendElement(dom, item, 'guid', path)

            filename = blog.src_path + '/_post/' + str(post.id)

            if not os.path.exists(filename):
                self.addError('File does not exists ' + filename)
                return

            f = open(filename, 'rb')
            post_content = f.read()
            f.close()

            self.appendElement(dom, item, 'description', '<![CDATA[' + post_content + ']]>')

            author = post.author.email
            author += ' (' + post.author.first_name + ' ' + post.author.last_name + ')'
            self.appendElement(dom, item, 'author', author)
            self.appendElement(dom, item, 'category', post.category.name)

            creationDate = post.creation_date.strftime('%a, %d %b %Y %H:%M:%S')
            self.appendElement(dom, item, 'pubDate', creationDate)
            channel.appendChild(item)
            
        
        filename = 'rss.xml'
        self.writeIfNotTheSame(output + '/' + filename, root)

        if not self.somethingWrote:
            self.addReport('Nothing changed')

        return self.report

