WIKI_FORMATS = ( ('MD', 'Markdown'), ('MW', 'Media Wiki'))

class WikiPage(models.Model):
    name = models.CharField(max_length = 128)
    slug = models.SlugField(unique=True, editable=False)
    version = models.IntegerField(editable=False, default=0)
    format = models.CharField(max_length=2, choices=WIKI_FORMATS)
    area = models.ForeignKey(WikiArea)
    markup = models.TextField()
    html = models.TextField(editable=False, blank=True)
    modified = models.DateTimeField(
                   editable=False,
                   default=datetime.datetime.now)


    def save(self):
        from django.template.defaultfilters import slugify
        from development.wiki.forms import WikiTextArchiveForm
        from django import forms

        if self.version is None:
           self.version = 1
        else:
           self.version = self.version + 1

        self.slug = "%s_%s" % (self.area.slug, slugify(self.name))

        if self.format == 'MW':
            from development.wiki.utils import mwit
            self.html = mwit(self.slug, self.markup)
        elif self.format == 'MD':
            from markdown import markdown
            self.html = markdown(self.markup)

        self.modified = datetime.datetime.now()
        super(WikiPage, self).save()
        archive = {'page': self.id,
                   'version': self.version,
                   'format': self.format,
                   'markup': self.markup,
                   'modified': self.modified }
        form = WikiTextArchiveForm(archive)
        form.save()


def mwit(title, input):
    from mwlib.uparser import parseString
    from mwlib.htmlwriter import HTMLWriter
    from mwlib.dummydb import DummyDB
    from django.utils.encoding import smart_unicode

    db = DummyDB()
    import StringIO

    out = StringIO.StringIO()

    if input.endswith(chr(13)+chr(10)):
        input = input.replace(chr(13)+chr(10),chr(10))
    if input.endswith(chr(13)):
        input = input.replace(chr(13),chr(10))

    try:
        p = parseString(title, input, db)
    except:
        return u'Unable to parse input!'
    try:
        w = HTMLWriter(out)
    except:
        return u'Unable call HTMLWriter!'
    try:
        w.write(p)
    except:
        return u'Unable to write input!'

    return unicode(out.getvalue())