-- | Data structures for Entrez HTTP queries

module Bio.EntrezHTTPData where

-- | Input datastructure for EntrezHTTP. Program is the selected eutility (e.g efetch, esearch),
--   database is the selected Entrez database (nucleotide) and query the query string.
data EntrezHTTPQuery = EntrezHTTPQuery 
  { program :: Maybe String
  , database :: Maybe String
  , query :: String 
  }
  deriving (Show, Eq)

-- | Data structure for Entrez summary result
data EntrezSummary = EntrezSummary
  {  documentSummaries :: [EntrezDocSum]}
  deriving (Show, Eq)

data EntrezDocSum = EntrezDocSum
  {  summaryId :: String
  ,  summaryItems :: [SummaryItem]}
  deriving (Show, Eq)

data SummaryItem = SummaryItem
  { itemName :: String
  , itemType :: String
  , itemContent :: String}
  deriving (Show, Eq)

-- | Gene doc summary
data EntrezGeneSummary = EntrezGeneSummary
  {  geneSummaries :: [EntrezGeneDocSummary]}
  deriving (Show, Eq)

data EntrezGeneDocSummary = EntrezGeneDocSummary
  { geneId :: String
  , geneName :: String
  , geneStatus :: String
  , geneCurrentID :: String
  , geneGeneticSource :: String
  , geneOtherAliases :: String
  , geneGenomicInfo :: EntrezGenomicInfo}
  deriving (Show, Eq)

data EntrezGenomicInfo = EntrezGenomicInfo
  { chrAccVer :: String
  , chrStart :: Int
  , chrStop :: Int
  , exonCount :: Int
  }
  deriving (Show, Eq)

-- | Data structure for Entrez search result
data EntrezSearch = EntrezSearch
  { count :: Int
  , retMax :: Int
  , retStart :: Int
  , searchIds :: [Int]
  , translationStack :: [TranslationStack]
  , queryTranslation :: String}
  deriving (Show, Eq)

data TranslationStack = TranslationStack
  { termSets :: [TermSet]
  , operation :: String}
  deriving (Show, Eq)

data TermSet = TermSet
  { term :: String
  , field :: String
  , termCount :: Int
  , explode :: String}
  deriving (Show, Eq)