{-# LANGUAGE OverloadedStrings #-}
module Finance.OpenSymbology.Parser (entryParser) where

import Control.Applicative
import Data.Attoparsec.Text (Parser,(<?>))
import qualified Data.Attoparsec.Text as A
import Data.Text (Text)
import qualified Data.Text as T
import Finance.OpenSymbology.PricingSourceParsers
import Finance.OpenSymbology.Types

--import Finance.OpenSymbology.PricingSourceAbbreviations

entryParser :: Parser BloombergEntry
entryParser = parseHeader <|> (mkBloombergEntry
    <$> (parseColumn                          <?> "0 Name")
    <*> (parseColumn                          <?> "1 Ticker")
    <*> ((pricingSourceParser <* (A.try $ A.char '|'))  <?> "2 PricingSource")
--    <*> ((A.string "US" *> pure (Just US) <* A.char '|')  <?> "2 PricingSource")
    <*> ((textToMaybe <$> parseColumn)        <?> "3 SourceId")
    <*> ((textToMaybe <$> parseColumn)        <?> "4 UniqueId")
    <*> ((textToMaybe <$> parseColumn)        <?> "5 SecurityType")
    <*> (parseColumn                          <?> "6 MarketSector")
    <*> ((BloombergId <$> parseColumn)        <?> "7 BloombergId")
    <*> ((BloombergId <$> parseColumn)        <?> "8 BloombergCompositeId"))
  where parseColumn = A.takeWhile (/= '|') <* (A.try $ A.char '|')
        mkBloombergEntry name ticker prcSrc srcId uniqId secType mktSect bid bidComp = BloombergEntry
          { beName = BloombergName name
          , beSymbol = BloombergSymbol ticker
          , bePricingSource = prcSrc
          , beSecurityType = secType
          , beMarketSector = mktSect
          , beBloombergId = bid
          , beBloombergCompositeId = bidComp
          , beSourceId = srcId
          , beUniqueId = uniqId }
        parseHeader = A.string "NAME|ID_BB_SEC_NUM_DES|FEED_SOURCE|ID_BB_SEC_NUM_SRC|ID_BB_UNIQUE|SECURITY_TYP|MARKET_SECTOR_DES|ID_BB_GLOBAL|COMPOSITE_ID_BB_GLOBAL|" *> pure BloombergHeader

textToMaybe :: Text -> Maybe Text
textToMaybe x =
  case T.null x of
    True -> Nothing
    False -> Just x