module Control.Distributed.Raketka.Master where

import Data.Tagged
import Control.Distributed.Process as P
import Control.Monad
import Control.Distributed.Process.Backend.SimpleLocalnet
import Control.Distributed.Raketka.Type.Arg as T
import Control.Distributed.Raketka.Type.Server
import Control.Distributed.Raketka.NodeId as N

{-| * registers own pid
    * calls 'whereisRemoteAsync' for each suggested peer
    * calls 'startServer'  
-}
master::Specific tag ps s c =>
    Backend
    -> Cluster          -- ^ server ids from config   
    -> Tagged tag Int   -- ^ this server's idx in cluster  
    -> s                -- ^ init custom state
    -> Process ()
master backend0 (Cluster ids0) idx1@(Tagged idx0) state0 = do
  mynode1 <- getSelfNode

  let peers1 = N.nodeId <$> ids0
      this1 = ids0 !! idx0
      service1 = T.service this1
      peers2 = filter (/= mynode1) peers1

  mypid1 <- getSelfPid

  register service1 mypid1

  forM_ peers2 $ \(peer1::NodeId) -> P.whereisRemoteAsync peer1 service1

  startServer (passTag idx1 this1) state0