--------------------------------------------------------------------
-- |
-- Module    : Text.RSS1.Syntax
-- Copyright : (c) Galois, Inc. 2008,
--             (c) Sigbjorn Finne 2009-
-- License   : BSD3
--
-- Maintainer: Sigbjorn Finne <sof@forkIO.com>
-- Stability : provisional
-- Portability: portable
--
--------------------------------------------------------------------
module Text.RSS1.Syntax
  ( URIString
  , TitleString
  , TimeString
  , TextString
  , Feed(..)
  , Channel(..)
  , Image(..)
  , Item(..)
  , TextInputInfo(..)
  , TaxonomyTopic(..)
  , UpdatePeriod(..)
  , ContentInfo(..)
  , nullFeed
  , nullChannel
  , nullImage
  , nullItem
  , nullTextInputInfo
  , nullTaxonomyTopic
  , nullContentInfo
  ) where

import Prelude ()
import Prelude.Compat

import Data.Text
import Data.XML.Compat
import Data.XML.Types as XML
import Text.DublinCore.Types

type URIString = Text

type TitleString = Text

type TimeString = Text

type TextString = Text

data Feed = Feed
  { feedVersion :: Text
  , feedChannel :: Channel
  , feedImage :: Maybe Image
  , feedItems :: [Item]
  , feedTextInput :: Maybe TextInputInfo
  , feedTopics :: [TaxonomyTopic]
  , feedOther :: [XML.Element]
  , feedAttrs :: [Attr]
  } deriving (Show)

data Channel = Channel
  { channelURI :: URIString
  , channelTitle :: TitleString
  , channelLink :: URIString
  , channelDesc :: TextString
           -- these are indirect RDF associations to elements declared
           -- outside the channel element in the RDF \/ feed document.
  , channelImageURI :: Maybe URIString
  , channelItemURIs :: [URIString]
  , channelTextInputURI :: Maybe URIString
  , channelDC :: [DCItem]
  , channelUpdatePeriod :: Maybe UpdatePeriod
  , channelUpdateFreq :: Maybe Integer
  , channelUpdateBase :: Maybe TimeString -- format is yyyy-mm-ddThh:mm
  , channelContent :: [ContentInfo]
  , channelTopics :: [URIString]
  , channelOther :: [XML.Element]
  , channelAttrs :: [Attr]
  } deriving (Show)

data Image = Image
  { imageURI :: URIString -- the image resource, most likely.
  , imageTitle :: TextString -- the "alt"ernative text.
  , imageURL :: URIString
  , imageLink :: URIString -- the href of the rendered img resource.
  , imageDC :: [DCItem]
  , imageOther :: [XML.Element]
  , imageAttrs :: [Attr]
  } deriving (Show)

data Item = Item
  { itemURI :: URIString
  , itemTitle :: TextString
  , itemLink :: URIString
  , itemDesc :: Maybe TextString
  , itemDC :: [DCItem]
  , itemTopics :: [URIString]
  , itemContent :: [ContentInfo]
  , itemOther :: [XML.Element]
  , itemAttrs :: [Attr]
  } deriving (Show)

data TextInputInfo = TextInputInfo
  { textInputURI :: URIString
  , textInputTitle :: TextString
  , textInputDesc :: TextString
  , textInputName :: TextString
  , textInputLink :: URIString
  , textInputDC :: [DCItem]
  , textInputOther :: [XML.Element]
  , textInputAttrs :: [Attr]
  } deriving (Show)

data TaxonomyTopic = TaxonomyTopic
  { taxonomyURI :: URIString
  , taxonomyLink :: URIString
  , taxonomyTitle :: Maybe Text
  , taxonomyDesc :: Maybe Text
  , taxonomyTopics :: [URIString]
  , taxonomyDC :: [DCItem]
  , taxonomyOther :: [XML.Element]
  } deriving (Show)

data UpdatePeriod
  = Update_Hourly
  | Update_Daily
  | Update_Weekly
  | Update_Monthly
  | Update_Yearly
  deriving (Eq, Show)

data ContentInfo = ContentInfo
  { contentURI :: Maybe URIString
  , contentFormat :: Maybe URIString
  , contentEncoding :: Maybe URIString
  , contentValue :: Maybe Text -- should be: RDFValue
  } deriving (Eq, Show)

--default constructors:
nullFeed :: URIString -> TitleString -> Feed
nullFeed uri title =
  Feed
  { feedVersion = "1.0"
  , feedChannel = nullChannel uri title
  , feedImage = Nothing
  , feedItems = []
  , feedTextInput = Nothing
  , feedTopics = []
  , feedOther = []
  , feedAttrs = []
  }

nullChannel :: URIString -> TitleString -> Channel
nullChannel uri title =
  Channel
  { channelURI = uri
  , channelTitle = title
  , channelLink = uri
  , channelDesc = title
  , channelImageURI = Nothing
  , channelItemURIs = []
  , channelTextInputURI = Nothing
  , channelDC = []
  , channelUpdatePeriod = Nothing
  , channelUpdateFreq = Nothing
  , channelUpdateBase = Nothing
  , channelContent = []
  , channelTopics = []
  , channelOther = []
  , channelAttrs = []
  }

nullImage :: URIString -> Text -> URIString -> Image
nullImage imguri title link =
  Image
  { imageURI = imguri
  , imageTitle = title
  , imageURL = imguri
  , imageLink = link
  , imageDC = []
  , imageOther = []
  , imageAttrs = []
  }

nullItem :: URIString -> TextString -> URIString -> Item
nullItem uri title link =
  Item
  { itemURI = uri
  , itemTitle = title
  , itemLink = link
  , itemDesc = Nothing
  , itemDC = []
  , itemTopics = []
  , itemContent = []
  , itemOther = []
  , itemAttrs = []
  }

nullTextInputInfo :: URIString -> TextString -> TextString -> URIString -> TextInputInfo
nullTextInputInfo uri title nm link =
  TextInputInfo
  { textInputURI = uri
  , textInputTitle = title
  , textInputDesc = title
  , textInputName = nm
  , textInputLink = link
  , textInputDC = []
  , textInputOther = []
  , textInputAttrs = []
  }

nullTaxonomyTopic :: URIString -> URIString -> TaxonomyTopic
nullTaxonomyTopic uri link =
  TaxonomyTopic
  { taxonomyURI = uri
  , taxonomyLink = link
  , taxonomyTitle = Nothing
  , taxonomyDesc = Nothing
  , taxonomyTopics = []
  , taxonomyDC = []
  , taxonomyOther = []
  }

nullContentInfo :: ContentInfo
nullContentInfo =
  ContentInfo
  {contentURI = Nothing, contentFormat = Nothing, contentEncoding = Nothing, contentValue = Nothing}