content: {-# LANGUAGE OverloadedStrings #-}
  {-# LANGUAGE TemplateHaskell   #-}
  
  module Main where
  
  import           MCP.Server
  import           MCP.Server.Derive
  import           System.IO (hSetEncoding, stderr, stdout, utf8)
  import           Types
  
  -- High-level handler functions
  
  handlePrompt :: MyPrompt -> IO Content
  handlePrompt (Recipe idea) =
      pure $ ContentText $ "Recipe prompt for " <> idea <> ": Start by gathering fresh ingredients..."
  handlePrompt (Shopping description) =
      pure $ ContentText $ "Shopping prompt for " <> description <> ": Create a detailed shopping list..."
  
  handleResource :: URI -> MyResource -> IO ResourceContent
  handleResource uri ProductCategories =
      pure $ ResourceText uri "text/plain" "Fresh Produce, Dairy, Bakery, Meat & Seafood, Frozen Foods"
  handleResource uri SaleItems =
      pure $ ResourceText uri "text/plain" "Organic Apples $2.99/lb, Free Range Eggs $4.50/dozen, Artisan Bread $3.25/loaf"
  handleResource uri HeadlineBannerAd =
      pure $ ResourceText uri "text/plain" "🛒 Weekly Special: 20% off all organic produce! 🥕🥬🍎"
  
  handleTool :: MyTool -> IO Content
  handleTool (SearchForProduct q category) =
      case category of
          Nothing -> pure $ ContentText $ "Search results for '" <> q <> "': Found 15 products across all categories"
          Just cat -> pure $ ContentText $ "Search results for '" <> q <> "' in " <> cat <> ": Found 8 products"
  handleTool (AddToCart sku) = pure $ ContentText $ "Added item " <> sku <> " to your cart. Cart total: 3 items"
  handleTool Checkout = pure $ ContentText "Checkout completed! Order #12345 confirmed. Thank you for shopping with us!"
  handleTool (ComplexTool field1 field2 field3 field4 field5) =
      pure $ ContentText $ "Complex tool called with: " <> field1 <> ", " <> field2 <>
                          maybe "" (", " <>) field3 <> ", " <> field4 <>
                          maybe "" (", " <>) field5
  
  main :: IO ()
  main = do
      -- Set UTF-8 encoding to handle Unicode characters properly
      hSetEncoding stdout utf8
      hSetEncoding stderr utf8
      -- Derive the handlers using Template Haskell
      let prompts = $(derivePromptHandler ''MyPrompt 'handlePrompt)
          resources = $(deriveResourceHandler ''MyResource 'handleResource)
          tools = $(deriveToolHandler ''MyTool 'handleTool)
       in runMcpServerStdio
          McpServerInfo
              { serverName = "Complete Example MCP Server"
              , serverVersion = "0.3.0"
              , serverInstructions = "An example MCP server that handles prompts, resources, and tools."
              }
          McpServerHandlers
              { prompts = Just prompts
              , resources = Just resources
              , tools = Just tools
              }
  