import System.IO
import System.Environment
import Data.Maybe
import Control.Exception
import Database.HDBC
import Database.HDBC.PostgreSQL

import qualified Embeddings as E

-- ----------------------------

--sajiyeLekho :: Statement -> IO ()
sajiyeLekho (singleSym,singleId) = do
 putStr $ "<li>" ++ (fromSql singleSym) ++ " (id = " ++ (fromSql singleId) ++ ")<p>"


-- ============================

main = 
 Control.Exception.catch (do
  pass <- getEnv "HOMOEOPIM_POOKAI_PASSWORD"
  e <- getEnv "WWW_symptom" -- first symptom field should not be empty!
  f' <- lookupEnv "WWW_chapter"
  let f = fromMaybe " " f'
  g' <- lookupEnv "WWW_gender"
  let g = fromMaybe " " g'

  --let lev4 = e++" "++f++" "++g++" "
  let restQuery = "search_query: chapter: " ++ f ++ ". gender: " ++ g ++ ". symptom: " ++ e ++ "."
 
  let authString = "host=localhost port=5433 dbname=homoeopim user=pookai password=" ++ pass
  c <- connectPostgreSQL authString

  putStrLn "Content-type: text/plain\n"
  resp <- E.doQuery restQuery -- runs the REST request and returns a Response
  let emb = (E.getEmbedding resp) -- emb now contains the vector corresponding to the query
  --putStr $ "{\"moja1\":\"" ++ emb ++ "\"}"

  let queryString = "select symptom, id from symp_emb order by embedding <=> ? asc limit 30"
  --let queryString = "select id,symptom from symp_emb limit 2"
  targetList <- prepare c queryString
  execute targetList [toSql emb] -- cosine similarity
  result <- fetchAllRows targetList
  let resSymptom = map (!!0) result
  let resId = map (!!1) result
  --let res1 = map (fromSql) res
  putStr $ "{\"moja1\":\"<ol>"
  --putStr (fromSql ((result!!0)!!0))
  let symId = zip resSymptom resId
  mapM_ (sajiyeLekho) symId
  putStr "</ol>"
  --putStr (show res)
  putStr "\"}";
  
  disconnect c)
  handler where
   handler :: SqlError -> IO ()
   handler err = putStrLn $ "Content-type: text/plain\n\n{\"moja1\":\"" ++ show err ++ "\"}"

