module Mail.Hailgun.AttachmentsSearch
   ( findInlineImagesInHtmlEmail
   , InlineImage(..)
   ) where

import           Control.Monad         (guard)
import qualified Data.ByteString       as B
import qualified Data.ByteString.Char8 as BC
import           Data.List             (find, nub)
import           Data.Maybe            (catMaybes)
import qualified Text.HTML.TagSoup     as TS

-- Finds the unique inline images in the email
findInlineImagesInHtmlEmail :: B.ByteString -> [InlineImage]
findInlineImagesInHtmlEmail = nub . catMaybes . fmap tagToInlineImage . TS.parseTags

data InlineImage = InlineImage
   { imageSrc :: B.ByteString
   } deriving (Eq, Show)

imgTagName :: B.ByteString
imgTagName = BC.pack "img"

srcTagName :: B.ByteString
srcTagName = BC.pack "src"

inlineImageUrlPrefix :: B.ByteString
inlineImageUrlPrefix = BC.pack "cid:"

tagToInlineImage :: TS.Tag B.ByteString -> Maybe InlineImage
tagToInlineImage (TS.TagOpen name attrs) =
   if name == imgTagName
      then do
         srcAttr <- find ((==) srcTagName . fst) attrs
         guard (inlineImageUrlPrefix `B.isPrefixOf` snd srcAttr)
         return . InlineImage . B.drop (B.length inlineImageUrlPrefix) . snd $ srcAttr
      else Nothing
tagToInlineImage _ = Nothing