-- Takes a reversed log file on the standard input and outputs web page.

module Main (main) where

import Data.List		( nubBy )
import Data.Maybe		( fromMaybe )
import Distribution.Text	( display )
import Text.XHtml

import HackagePage		( hackagePageWith )
import Locations		( rssFeedURL, graphURL )
import Util			( packageURL, readPackageId )

main :: IO ()
main = do
	log_text <- getContents
	let log_rows = map makeRow $ take 20 $ nubBy samepkgId $
		map words $ lines log_text
	let docBody = [
		-- temporarily turned off
		-- thediv ! [theclass "floatright"] << graph,
		h2 << "Recent additions",
		table ! [align "center"] << log_rows]
	let rss_link = thelink ! [rel "alternate", thetype "application/rss+xml", title "HackageDB RSS Feed", href rssFeedURL] << noHtml
	putStr $ renderHtml $
		hackagePageWith [rss_link] "recent additions" docBody
  where samepkgId xs ys = drop 7 xs == drop 7 ys
	graph = image ! [alt "", src graphURL]

makeRow :: [String] -> Html
makeRow [day, mon, dayno, time, tz, year, user, pkg, vers] = tr <<
	[td ! [align "right"] <<
		[toHtml (unwords [day, mon, dayno, time, tz, year]), nbsp, nbsp],
	 td ! [align "left"] << user,
	 td ! [align "left"] << 
		[nbsp, nbsp,
		 anchor ! [href (packageURL pkgId)] << display pkgId]]
  where pkgId = fromMaybe (error "illegal package identifier")
			(readPackageId (pkg ++ "-" ++ vers))
	nbsp = primHtmlChar "nbsp"
makeRow _ = error "bad log line"
