#!/usr/bin/python2.4
# -*- python -*-
#
# A thoroughly lame weblog: Publisher interface
# (C) 2002-04 Chris Lawrence

# Theory of operation:
# - Use postgresql to do the heavy lifting; that's why we have databases
#
# Tables:
# - content
# - topics
# - authors

import sys, re, urllib, os, cStringIO, blog, blog_config
import cgi, Cookie
import StringIO

from mod_python import apache
from mx import DateTime

def _make_cookie(key, val):
    cookies = Cookie.BaseCookie()
    cookies[key] = val
    cookies[key]['Path'] = '/'
    cookies[key]['Comment'] = 'Stylesheet for this page'
#    cookies[key]['Version'] = '1'
    cookies[key]['Max-Age'] = '86400000'
#    cookies[key]['Domain'] = blog_config.HOSTURL
    return cookies.output(header='').strip()

def setcookie(req, style=None, tz=None, limit=None, blogroll=None,
              fullroll=None, hidecomments=None, time24=None):
    referrer = blog_config.URL
    if referrer.find('force_refresh=1') >= 0:
        pass
    elif '?' in referrer:
        referrer += '&force_refresh=1'
    else:
        referrer += '?force_refresh=1'
    req.err_headers_out.add('Location', referrer)
    req.err_headers_out.add('Cache-Control', 'private')
    req.err_headers_out.add('Cache-Control', 'no-cache="set-cookie"')
    req.err_headers_out.add('Expires', 'Fri, 01 Jan 1971 00:00:00 UTC')

    if style:
        req.err_headers_out.add('Set-Cookie', _make_cookie('style', style))

    if tz:
        req.err_headers_out.add('Set-Cookie', _make_cookie('timezone', tz))

    if limit:
        req.err_headers_out.add('Set-Cookie', _make_cookie('limit', limit))

    if blogroll:
        req.err_headers_out.add('Set-Cookie', _make_cookie('blogroll', blogroll))

    fullroll = str(int(fullroll is not None))
    req.err_headers_out.add('Set-Cookie', _make_cookie('fullroll', fullroll))

    time24 = str(int(time24 is not None))
    req.err_headers_out.add('Set-Cookie', _make_cookie('time24', time24))

    showcomments = str(int(hidecomments is None))
    req.err_headers_out.add('Set-Cookie', _make_cookie('showcomments',
                                                       showcomments))

    raise apache.SERVER_RETURN, apache.HTTP_MOVED_PERMANENTLY

_intre = re.compile(r'/(?:month|day|entry)/(\d+)')

def day(req, **args):
    req.log_error(req.path_info)

    m = _intre.match(req.path_info)
    if not m:
        raise apache.SERVER_RETURN, apache.HTTP_BAD_REQUEST

    rday = int(m.group(1))
    return index(req, day=rday, **args)

def entry(req, **args):
    m = _intre.match(req.path_info)
    if not m:
        raise apache.SERVER_RETURN, apache.HTTP_BAD_REQUEST

    rentry = int(m.group(1))
    return index(req, entryid=rentry, **args)

def month(req, **args):
    m = _intre.match(req.path_info)
    if not m:
        raise apache.SERVER_RETURN, apache.HTTP_BAD_REQUEST

    rmonth = int(m.group(1))
    return index(req, month=rmonth, **args)

def mobile(req, **args):
    return index(req, plain=True, **args)

def index(req, **args):
    referrer = req.headers_in.get('Referer')
    localref = referrer and referrer.startswith(blog_config.URL)

    cookie_str = req.headers_in.get('Cookie', '')
    try:
        cookies = Cookie.BaseCookie(cookie_str)
    except CookieError:
        cookies = Cookie.BaseCookie()

    ims = req.headers_in.get('If-Modified-Since')

    out = sys.stdout
    sys.stdout = newout = StringIO.StringIO()
    resp = blog.generate_page(req, localref=localref, cookies=cookies, ims=ims,
                              **args)
    if resp and resp != 200:
        raise apache.SERVER_RETURN, resp

    sys.stdout = out
    val = newout.getvalue()
    if not val:
        # Try again.
        return index(req, **args)

    return val

def config(req):
    cookie_str = req.headers_in.get('Cookie', '')
    try:
        cookies = Cookie.BaseCookie(cookie_str)
    except CookieError:
        cookies = Cookie.BaseCookie()

    out, newout = sys.stdout, cStringIO.StringIO()
    sys.stdout = newout
    resp = blog.configpage(cookies, req=req)
    if resp and resp != 200:
        raise apache.SERVER_RETURN, resp

    sys.stdout = out
    val = newout.getvalue()
    if not val:
        return '<h1>Something funky</h1>'
    return val
