module System.Mesos.Raw.Scheduler where
import           System.Mesos.Internal
import           System.Mesos.Raw.Credential
import           System.Mesos.Raw.ExecutorId
import           System.Mesos.Raw.Filters
import           System.Mesos.Raw.FrameworkId
import           System.Mesos.Raw.FrameworkInfo
import           System.Mesos.Raw.MasterInfo
import           System.Mesos.Raw.Offer
import           System.Mesos.Raw.OfferId
import           System.Mesos.Raw.Request
import           System.Mesos.Raw.SlaveId
import           System.Mesos.Raw.TaskId
import           System.Mesos.Raw.TaskInfo
import           System.Mesos.Raw.TaskStatus
type SchedulerPtr = Ptr Scheduler

data Scheduler = Scheduler
  { schedulerImpl                :: SchedulerPtr
  , rawSchedulerRegistered       :: FunPtr RawSchedulerRegistered
  , rawSchedulerReRegistered     :: FunPtr RawSchedulerReRegistered
  , rawSchedulerDisconnected     :: FunPtr RawSchedulerDisconnected
  , rawSchedulerResourceOffers   :: FunPtr RawSchedulerResourceOffers
  , rawSchedulerOfferRescinded   :: FunPtr RawSchedulerOfferRescinded
  , rawSchedulerStatusUpdate     :: FunPtr RawSchedulerStatusUpdate
  , rawSchedulerFrameworkMessage :: FunPtr RawSchedulerFrameworkMessage
  , rawSchedulerSlaveLost        :: FunPtr RawSchedulerSlaveLost
  , rawSchedulerExecutorLost     :: FunPtr RawSchedulerExecutorLost
  , rawSchedulerError            :: FunPtr RawSchedulerError
  }

-- | Type representing the connection from a scheduler to Mesos. This
-- handle is used both to manage the scheduler's lifecycle (start
-- it, stop it, or wait for it to finish) and to interact with Mesos
-- (e.g., launch tasks, kill tasks, etc.).
newtype SchedulerDriver = SchedulerDriver { fromSchedulerDriver :: SchedulerDriverPtr }
  deriving (Show, Eq)

type SchedulerDriverPtr = Ptr SchedulerDriver

type RawSchedulerRegistered = SchedulerDriverPtr -> FrameworkIDPtr -> MasterInfoPtr -> IO ()

type RawSchedulerReRegistered = SchedulerDriverPtr -> MasterInfoPtr -> IO ()

type RawSchedulerDisconnected = SchedulerDriverPtr -> IO ()

type RawSchedulerResourceOffers = SchedulerDriverPtr -> Ptr OfferPtr -> CInt -> IO ()

type RawSchedulerOfferRescinded = SchedulerDriverPtr -> OfferIDPtr -> IO ()

type RawSchedulerStatusUpdate = SchedulerDriverPtr -> TaskStatusPtr -> IO ()

type RawSchedulerFrameworkMessage = SchedulerDriverPtr -> ExecutorIDPtr -> SlaveIDPtr -> Ptr CChar -> Int -> IO ()

type RawSchedulerSlaveLost = SchedulerDriverPtr -> SlaveIDPtr -> IO ()

type RawSchedulerExecutorLost = SchedulerDriverPtr -> ExecutorIDPtr -> SlaveIDPtr -> CInt -> IO ()

type RawSchedulerError = SchedulerDriverPtr -> Ptr CChar -> CInt -> IO ()

foreign import ccall "wrapper" wrapSchedulerRegistered
  :: RawSchedulerRegistered
  -> IO (FunPtr RawSchedulerRegistered)

foreign import ccall "wrapper" wrapSchedulerReRegistered
  :: RawSchedulerReRegistered
  -> IO (FunPtr RawSchedulerReRegistered)

foreign import ccall "wrapper" wrapSchedulerDisconnected
  :: RawSchedulerDisconnected
  -> IO (FunPtr RawSchedulerDisconnected)

foreign import ccall "wrapper" wrapSchedulerResourceOffers
  :: RawSchedulerResourceOffers
  -> IO (FunPtr RawSchedulerResourceOffers)

foreign import ccall "wrapper" wrapSchedulerOfferRescinded
  :: RawSchedulerOfferRescinded
  -> IO (FunPtr RawSchedulerOfferRescinded)

foreign import ccall "wrapper" wrapSchedulerStatusUpdate
  :: RawSchedulerStatusUpdate
  -> IO (FunPtr RawSchedulerStatusUpdate)

foreign import ccall "wrapper" wrapSchedulerFrameworkMessage
  :: RawSchedulerFrameworkMessage
  -> IO (FunPtr RawSchedulerFrameworkMessage)

foreign import ccall "wrapper" wrapSchedulerSlaveLost
  :: RawSchedulerSlaveLost
  -> IO (FunPtr RawSchedulerSlaveLost)

foreign import ccall "wrapper" wrapSchedulerExecutorLost
  :: RawSchedulerExecutorLost
  -> IO (FunPtr RawSchedulerExecutorLost)

foreign import ccall "wrapper" wrapSchedulerError
  :: RawSchedulerError
  -> IO (FunPtr RawSchedulerError)

foreign import ccall safe "ext/scheduler.h createScheduler" c_createScheduler
  :: FunPtr RawSchedulerRegistered
  -> FunPtr RawSchedulerReRegistered
  -> FunPtr RawSchedulerDisconnected
  -> FunPtr RawSchedulerResourceOffers
  -> FunPtr RawSchedulerOfferRescinded
  -> FunPtr RawSchedulerStatusUpdate
  -> FunPtr RawSchedulerFrameworkMessage
  -> FunPtr RawSchedulerSlaveLost
  -> FunPtr RawSchedulerExecutorLost
  -> FunPtr RawSchedulerError
  -> IO SchedulerPtr

foreign import ccall safe "ext/scheduler.h destroyScheduler" c_destroyScheduler
  :: SchedulerPtr
  -> IO ()

foreign import ccall safe "ext/scheduler.h createSchedulerDriver" c_createSchedulerDriver
  :: SchedulerPtr
  -> FrameworkInfoPtr
  -> Ptr CChar
  -> CInt
  -> IO SchedulerDriverPtr

foreign import ccall safe "ext/scheduler.h createSchedulerDriverWithCredentials"  c_createSchedulerDriverWithCredentials
  :: SchedulerPtr
  -> FrameworkInfoPtr
  -> Ptr CChar
  -> CInt
  -> CredentialPtr
  -> IO SchedulerDriverPtr

foreign import ccall safe "ext/scheduler.h destroySchedulerDriver" c_destroySchedulerDriver
  :: SchedulerDriverPtr
  -> IO ()

foreign import ccall safe "ext/scheduler.h startSchedulerDriver" c_startSchedulerDriver
  :: SchedulerDriverPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h stopSchedulerDriver" c_stopSchedulerDriver
  :: SchedulerDriverPtr
  -> CInt
  -> IO CInt

foreign import ccall safe "ext/scheduler.h abortSchedulerDriver" c_abortSchedulerDriver
  :: SchedulerDriverPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h joinSchedulerDriver" c_joinSchedulerDriver
  :: SchedulerDriverPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h runSchedulerDriver" c_runSchedulerDriver
  :: SchedulerDriverPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h requestResources" c_requestResources
  :: SchedulerDriverPtr
  -> Ptr RequestPtr
  -> CInt
  -> IO CInt

foreign import ccall safe "ext/scheduler.h launchTasks" c_launchTasks
  :: SchedulerDriverPtr
  -> Ptr OfferIDPtr
  -> CInt
  -> Ptr TaskInfoPtr
  -> CInt
  -> FiltersPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h killTask" c_killTask
  :: SchedulerDriverPtr
  -> TaskIDPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h declineOffer" c_declineOffer
  :: SchedulerDriverPtr
  -> OfferIDPtr
  -> FiltersPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h reviveOffers" c_reviveOffers
  :: SchedulerDriverPtr
  -> IO CInt

foreign import ccall safe "ext/scheduler.h schedulerDriverSendFrameworkMessage" c_sendFrameworkMessage
  :: SchedulerDriverPtr
  -> ExecutorIDPtr
  -> SlaveIDPtr
  -> Ptr CChar
  -> CInt
  -> IO CInt

foreign import ccall safe "ext/scheduler.h reconcileTasks" c_reconcileTasks
  :: SchedulerDriverPtr
  -> Ptr TaskStatusPtr
  -> CInt
  -> IO CInt