#!/usr/bin/env python
import os
import sqlite3

import macros
from creoleparser import Parser, create_dialect, creole11_base

import circuits
from circuits.web import Controller, Logger, Server, Static


text2html = Parser(
    create_dialect(creole11_base, macro_func=macros.dispatcher),
    method='xhtml',
)


class Wiki:
    def __init__(self, database):
        super().__init__()

        create = not os.path.exists(database)

        self._cx = sqlite3.connect(database)
        self._cu = self._cx.cursor()

        if create:
            self._cu.execute('CREATE TABLE pages (name, text)')
            for defaultpage in os.listdir('defaultpages'):
                filename = os.path.join('defaultpages', defaultpage)
                self.save(defaultpage, open(filename).read())

    def save(self, name, text):
        self._cu.execute('SELECT COUNT() FROM pages WHERE name=?', (name,))
        row = self._cu.fetchone()
        if row[0]:
            self._cu.execute(
                'UPDATE pages SET text=? WHERE name=?',
                (text, name),
            )
        else:
            self._cu.execute(
                'INSERT INTO pages (name, text) VALUES (?, ?)',
                (name, text),
            )
        self._cx.commit()

    def get(self, name, default=None):
        self._cu.execute('SELECT text FROM pages WHERE name=?', (name,))
        row = self._cu.fetchone()
        return row[0] if row else default


class Root(Controller):
    db = Wiki('wiki.db')

    environ = {'db': db, 'macros': macros.loadMacros()}

    def GET(self, name='FrontPage', action='view'):
        environ = self.environ.copy()
        environ['page.name'] = name
        environ['parser'] = text2html

        d = {}
        d['title'] = name
        d['version'] = circuits.__version__
        d['menu'] = text2html(self.db.get('SiteMenu', ''), environ=environ)

        text = self.db.get(name, '')
        s = open('tpl/%s.html' % action).read()

        if action == 'view':
            d['text'] = text2html(text, environ=environ)
        else:
            d['text'] = text

        return s % d

    def POST(self, name='FrontPage', **form):
        self.db.save(name, form.get('text', ''))
        return self.redirect(name)


app = Server(('0.0.0.0', 8000))
Static(docroot='static').register(app)
Root().register(app)
Logger().register(app)
app.run()
