#! /usr/bin/python

import sys
sys.path.append('/var/www/cgi')
from mx.DateTime import *
from cgi import escape
import re
import MySQLdb, MySQLdb.cursors

from mod_python import apache, util

db = MySQLdb.connect(
  user = "root", passwd = "xxx", db = "test",
  cursorclass = MySQLdb.cursors.DictCursor
)
c = db.cursor()

block = {}
template = '/var/www/site/template'
password = 'xxxx'

for name in ('head', 'tail', 'entry', 'edit', 'comment', 'newcomment'):
  f = open(template + name + '.html')
  block[name] = f.read()
  f.close()

def renderentry (entry):
  ticks = int(entry['created'].ticks())
  entry['permilink'] = '/~edward/archives.py/' + `ticks`
  entry['edit'] = '/~edward/edit.py/' + `ticks`
  entry['created'] = ARPA.str(entry['created'])
  entry['updated'] = ''
  return block['entry'] % entry

def renderedit (entry, uri):
  entry['updated'] = ''
  entry['created'] = ARPA.str(entry['created'])
  entry['uri'] = uri
  return block['edit'] % entry

def rendercomment (comment):
  comment['content'] = "<p>" + escape(comment['content']).replace("\n", "<br />") + "</p>"
  comment['created'] = ARPA.str(comment['created'])
  return block['comment'] % comment

def head(req):
  req.content_type = 'text/html'
  req.send_http_header()
  req.write(block['head'])

def tail(req):
  req.write('<strong>time taken</strong> %f, <strong>uri</strong> %s'
    % (now().ticks() - req.request_time, req.uri))
  req.write(block['tail'])

def indexpage(req):
  head(req)
  c.execute("""
    select entries.title, entries.created, entries.content,
      count(comments.created) as comments
    from entries left join comments on entries.created = comments.entry
    group by entries.created
    order by created desc""")

  for entry in c.fetchall():
    req.write(renderentry(entry))

  tail(req)

  return apache.OK

def addentrypage(req):
  fs = util.FieldStorage(req, 1)

  if fs.has_key('submit'):
    if fs['password'] == password:
      c.execute("""
        insert into entries set title=%s, content=%s, created = %s""", (fs['title'], fs['content'], now()))
      return redirect(req)
    else:
      head(req)
      req.write('<p>wrong password</p>')

      req.write(block['edit'] % {'title': fs['title'],
        'content': fs['content'],
        'uri': req.uri,
        'created': '', 'updated': ''
      })
      tail(req)
  else:
    head(req)
    req.write(block['edit'] % {
      'title': '',
      'content': '<p></p>',
      'uri': req.uri,
      'created': '', 'updated': ''
    })
    tail(req)
 
  return apache.OK

def redirect(req):
  req.headers_out['location'] = '/~edward/'
  req.status = apache.HTTP_MOVED_TEMPORARILY
  return ""
 

def editpage(req, created):
  fs = util.FieldStorage(req, 1)

  created = localtime(created)
  if fs.has_key('submit'):
    if fs['password'] == password:
      c.execute("""
        update entries set title=%s, content=%s
        where created = %s""", (fs['title'], fs['content'], created))
      return redirect(req)
    else:
      head(req)
      req.write('<p>wrong password</p>')
      req.write(renderedit({
        'title': fs['title'],
        'content': fs['content'],
        'created': created,
        'updated': ''}, req.uri))
      tail(req)
  elif fs.has_key('delete'):
    if fs['password'] == password:
      c.execute("delete from entries where created = %s", created)
    return redirect(req)
  else:
    head(req)

    c.execute("""
      select title, created, content
      from entries
      where created = %s""", created)

    req.write(renderedit(c.fetchone(), req.uri))
    tail(req)
 
  return apache.OK

def archivepage(req, created):
  fs = util.FieldStorage(req, 1)

  created = localtime(created)

  if fs.has_key('submit'):
    c.execute("""insert into comments set title=%s, entry=%s, content=%s, created = %s""",
      (fs['title'], created, fs['content'], now()))
    req.headers_out['location'] = req.uri
    req.status = apache.HTTP_MOVED_TEMPORARILY
    return ""
  head(req)

  c.execute("""
    select entries.title, entries.created, entries.content,
      count(comments.created) as comments
    from entries left join comments on entries.created = comments.entry
    where entries.created = %s
    group by entries.created""", created)

  req.write(renderentry(c.fetchone()))

  req.write("<p>comments</p>")

  c.execute("""
    select title, created, content
    from comments
    where entry = %s
    order by created desc""", created)

  for comment in c.fetchall():
    req.write(rendercomment(comment))

  req.write(block['newcomment'] % {'title': '', 'content': '', 'uri': req.uri})

  tail(req)
  return apache.OK

dispatchre = re.compile('^/~edward/(archives|edit).py/(\d+)$')

def handler(req):
  m = dispatchre.match(req.uri)
  if m:
    return dispatch[m.group(1)](req, m.group(2))
  elif req.uri == '/~edward/add.py/' or req.uri == '/~edward/add.py':
    return addentrypage(req)
  else:
    return indexpage(req)

dispatch = {
  'add' : addentrypage,
  'archives' : archivepage,
  'edit' : editpage,
# 'comments' : comments
}