{-# LANGUAGE OverloadedStrings #-}

module Network.MCP.Server.Types where

import Control.Exception (SomeException)
import Data.Aeson
import Data.Map.Strict (Map)
import Control.Concurrent.STM
import Data.Text (Text)
import Network.MCP.Types

-- | Server type with resources, tools, prompts and handlers
data Server = Server
  { Server -> ServerInfo
serverInfo :: ServerInfo                               -- ^ Server information
  , Server -> ServerCapabilities
serverCapabilities :: ServerCapabilities               -- ^ Server capabilities
  , Server -> TVar [Resource]
serverResources :: TVar [Resource]                     -- ^ Available resources
  , Server -> TVar [Tool]
serverTools :: TVar [Tool]                             -- ^ Available tools
  , Server -> TVar [Prompt]
serverPrompts :: TVar [Prompt]                         -- ^ Available prompts
  , Server -> Text
serverInstructions :: Text                             -- ^ Instructions
  , Server -> TVar (Maybe ResourceReadHandler)
serverResourceReadHandler :: TVar (Maybe ResourceReadHandler)  -- ^ Resource read handler
  , Server -> TVar (Maybe ToolCallHandler)
serverToolCallHandler :: TVar (Maybe ToolCallHandler)         -- ^ Tool call handler
  , Server -> TVar (Maybe PromptHandler)
serverPromptHandler :: TVar (Maybe PromptHandler)             -- ^ Prompt handler
  , Server
-> TVar
     (Map Text (Value -> Server -> IO (Either SomeException Value)))
serverMessageHandlers :: TVar (Map Text (Value -> Server -> IO (Either SomeException Value)))  -- ^ Request handlers by method
  }

-- | Server handler for message processing
type ServerHandler = Server -> Value -> IO Value

-- | Resource read handler type
type ResourceReadHandler = ReadResourceRequest -> IO ReadResourceResult

-- | Tool call handler type
type ToolCallHandler = CallToolRequest -> IO CallToolResult

-- | Prompt handler type
type PromptHandler = GetPromptRequest -> IO GetPromptResult