{-# LANGUAGE OverloadedStrings #-}
module HTTP.ThirdParty.FakeUserAgent (getBrowserStrings, getLatestBrowserString) where

import Control.Lens ((^?))
import Data.ByteString.Lazy (ByteString, unpack)
import Data.Char (chr)
import Network.Wreq (get, responseBody)
import Text.HTML.TagSoup (parseTags, innerText, Tag(TagOpen, TagClose), (~/=))

getVersionsList :: [Tag ByteString] -> [Tag ByteString]
getVersionsList tags =
    let tags1 = (drop 1 . dropWhile (~/= TagOpen ("div" :: String) [("id", "liste")])) tags in
        takeWhile (~/= TagClose ("div" :: String)) tags1

getVersions :: [Tag ByteString] -> [ByteString] -> [ByteString]
getVersions [] accum = reverse accum
getVersions tags accum = 
    let tags1 = (drop 1 . dropWhile (~/= TagOpen ("li" :: String) [])) tags
        match = takeWhile (~/= TagClose ("li" :: String)) tags1
        tags2 = (drop 1 . dropWhile (~/= TagClose ("li" :: String))) tags1 in
        case match of
            [] -> getVersions tags2 accum
            _  -> getVersions tags2 ((innerText match):accum)

getBrowserStrings :: String -> IO [String]
getBrowserStrings name = do
    resp <- get ("http://useragentstring.com/pages/" ++ name ++ "/")
    let Just body = resp ^? responseBody
    let tags = parseTags body
    let versions = getVersions (getVersionsList tags) []
    return $ map ((map (chr . fromEnum) . unpack)) versions

getLatestBrowserString :: String -> IO String
getLatestBrowserString name = do
    latest:strings <- getBrowserStrings name
    return latest