module MediaWiki.API.Query.Revisions.Import where

import MediaWiki.API.Types
import MediaWiki.API.Utils
import MediaWiki.API.Query.Revisions

import Text.XML.Light.Types
import Text.XML.Light.Input ( parseXMLDoc )
import Text.XML.Light.Proc  ( strContent )

import Control.Monad
import Data.Maybe

stringXml :: String -> Either (String,[{-Error msg-}String]) RevisionsResponse
stringXml s = parseDoc xml s

xml :: Element -> Maybe RevisionsResponse
xml e = do
  guard (elName e == nsName "api")
  let es1 = children e
  p  <- pNode "query" es1
  let es = children p
  ps <- fmap (mapMaybe xmlPage) (fmap children $ pNode "pages" es)
  let cont = pNode "query-continue" es1 >>= xmlContinue "revisions" "rvstartid"
  return emptyRevisionsResponse
          { rvPages    = ps
	  , rvContinue = cont
	  }

xmlPage :: Element -> Maybe (PageTitle,[Revision])
xmlPage e = do
  guard (elName e == nsName "page")
  let ns      = fromMaybe mainNamespace $ pAttr "ns" e
  let tit     = fromMaybe "" $ pAttr "title" e
  let pid     = pAttr "pageid" e
  let es = children e  
  p  <- pNode "revisions" es
  let pg = emptyPageTitle{pgNS = ns, pgTitle=tit, pgMbId = pid}
  rs <- fmap (mapMaybe (xmlRevision pg)) (fmap children $ pNode "rev" es)
  return (pg, rs)

xmlRevision :: PageTitle -> Element -> Maybe Revision
xmlRevision pg e = do
  guard (elName e == nsName "page")
  let rid  = fromMaybe "" $ pAttr "revid" e
  let min  = isJust (pAttr "minor" e)
  let usr  = fromMaybe "" $ pAttr "user" e
  let anon = isJust (pAttr "anon" e)
  let ts   = fromMaybe "" $ pAttr "timestamp" e
  let size = fromMaybe 0 (pAttr "size" e >>= readMb)
  let com  = pAttr "comment" e
  let con  = case strContent e of { "" -> Nothing ; xs -> Just xs}
  return (emptyRevision pg)
             { revRevId = rid
	     , revIsMinor = min
	     , revUser = usr
	     , revIsAnon = anon
	     , revTimestamp = ts
	     , revSize = size
	     , revComment = com
	     , revContent = con
	     }