module Main where

import Auxiliary
import CGI
import Persistent2 as P
import Prelude hiding (div, head)
import List (find)

startWith :: Eq a => [a] -> [a] -> Bool
startWith s1 s2 = (take (length s2) s1) == s2

commandLength :: String -> Int
commandLength "/" = 1
commandLength s = length s + 1

selfLocation :: String -> Location
selfLocation path = Location (read ("http://www.jmuk.org/test/hwiki/" ++ path))

commands :: [(String, String -> CGI())]
commands = [("/edit", edit), ("/", view)]

main :: IO ()
main =
    do pathInfo <- protectedGetEnv "PATH_INFO" ""
       run $ dispatch pathInfo
    where dispatch pathInfo =
	      case find (startWith pathInfo . fst) commands of
	        Just (path, func) -> func (drop (commandLength path) pathInfo)
		Nothing -> tell $ selfLocation ""

view [] = view "FrontPage"
view pageName =
    do pageHandle <- P.init pageName ""
       pageData <- P.get pageHandle
       if length pageData == 0
	  then edit pageName
	  else ask $ standardPage pageName $ pre $ text_S pageData

edit [] = tell $ selfLocation ""
edit pageName =
    do pageHandle <- P.init pageName ""
       pageData <- P.get pageHandle
       ask $ standardPage ("edit of " ++ pageName) $ makeForm $
		    do submitPageData <- (makeTextarea pageData)
                            (attr "cols" "80" ## attr "rows" "25")
		       br empty
		       submit submitPageData (update pageName) empty

update pageName pageData =
    do pageHandle <- P.init pageName ""
       P.set pageHandle (value pageData)
       tell $ selfLocation pageName
