{-# LANGUAGE OverloadedStrings #-}
module Language.Translate.Naver ( translate
                                , translateMultiple
                                ) where

import Control.Lens ((^?))
import Data.Aeson.Lens (key)
import Data.Aeson.Types (Value(String))
import Data.LanguageCodes (ISO639_1, language)
import Data.Text (Text, cons, intercalate, pack, snoc, splitOn, strip)
import Network.Wreq (FormParam((:=)), post, responseBody)
import System.Random (getStdRandom, randomR)

translate :: ISO639_1 -> ISO639_1 -> Text -> IO Text
translate sourceLanguage targetLanguage text =
    let response =
            post
            "http://translate.naver.com/translate.dic"
            [ "query" := text
            , "srcLang" := (pack $ language sourceLanguage)
            , "tarLang" := (pack $ language targetLanguage)
            , "highlight" := ("0" :: Text)
            , "hurigana" := ("0" :: Text)]
        getResultData resp = resp ^? responseBody . key "resultData"
        resultData = response >>= return . getResultData
    in
        resultData >>= \dat -> case dat of
            Just (String translated) -> return translated
            _ -> ioError $ userError "translate.naver.com sent invalid response"

arbitraryNumericLength :: Int
arbitraryNumericLength = 20

arbitraryNumeric :: IO Text
arbitraryNumeric =
    let
        randomDigit i = getStdRandom (randomR (if i > 1 then '0' else '1', '9'))
        string = sequence $ map randomDigit [1..arbitraryNumericLength]
    in
        string >>= return . pack

translateMultiple :: ISO639_1 -> ISO639_1 -> [Text] -> IO [Text]
translateMultiple sourceLanguage targetLanguage texts = do
    spliter <- arbitraryNumeric
    let bundle = intercalate (snoc (cons ' ' spliter) ' ') texts
    result <- translate sourceLanguage targetLanguage bundle
    return $ map strip $ splitOn spliter result