-----------------------------------------------------------------------------
-- Copyright 2019, Advise-Me project team. This file is distributed under 
-- the terms of the Apache License 2.0. For more information, see the files
-- "LICENSE.txt" and "NOTICE.txt", which are included in the distribution.
-----------------------------------------------------------------------------
-- |
-- Maintainer  :  bastiaan.heeren@ou.nl
-- Stability   :  provisional
-- Portability :  portable (depends on ghc)
--
-----------------------------------------------------------------------------

module Service.Sequencer where

import System.Random
import qualified Database.HDBC as SQL
import qualified Database.HDBC.Sqlite3 as SQL (connectSqlite3, setBusyTimeout)

import Ideas.Common.Library
import Ideas.Service.Types hiding (tUserId)
import Recognize.Data.MathStoryProblem
import Recognize.Data.Solution
import Main.Tasks
import Service.Types
import Database.Data ( StudentID, tasksDone )

sequencer :: StudentID -> IO (Maybe (Exercise a))
sequencer uid = do
   conn <- SQL.connectSqlite3 "advise-me.db"
   done <- tasksDone conn uid
   let undone = filter (\t -> not $ showId t `elem` done) tasks
   i <- randomRIO (0, length undone-1)
   if null undone
      then return Nothing
      else case undone !! i of
            Task e -> return . Just . getExercise $ e


sequencerService :: Service
sequencerService = makeService "advise-me-next-task" "Sequencer service for Advise-Me project" $
   sequencer ::: tUserIdTag .-> tIO (tMaybe tExercise)