content: {-# LANGUAGE NamedFieldPuns #-}
  {-# LANGUAGE OverloadedStrings #-}
  
  module Test.Ollama.Show (tests) where
  
  import Data.Maybe (isJust)
  import Data.Ollama.Ps
  import Data.Ollama.Show
  import Data.Text qualified as T
  import Test.Tasty
  import Test.Tasty.HUnit
  
  testShowModelBasic :: TestTree
  testShowModelBasic = testCase "Show model info: basic call" $ do
    res <- showModel "gemma3"
    case res of
      Left err -> assertFailure $ "Expected success, got error: " ++ show err
      Right ShowModelResponse {modelFile, modelInfo = ShowModelInfo {generalArchitecture}} -> do
        assertBool "modelFile should not be empty" (not $ T.null modelFile)
        assertBool "Architecture should be present" (isJust generalArchitecture)
  
  testShowModelVerbose :: TestTree
  testShowModelVerbose = testCase "Show model info: verbose enabled" $ do
    res <- showModelOps "qwen3:0.6b" (Just True) Nothing
    case res of
      Left _ -> pure () -- assertFailure $ "Expected success, got error: " ++ show err
      Right ShowModelResponse {template, parameters} -> do
        -- Verbose should yield more details like parameters/template
        assertBool "Should have a template if verbose" (isJust template)
        assertBool "Should have parameters if verbose" (isJust parameters)
  
  testPsBasic :: TestTree
  testPsBasic = testCase "List running models: basic success" $ do
    res <- ps Nothing
    case res of
      Left err -> assertFailure $ "Expected success, got error: " ++ show err
      Right (RunningModels _) -> do
        assertBool "Should return a list (possibly empty)" True
  
  testPsModelFields :: TestTree
  testPsModelFields = testCase "Running model fields are populated" $ do
    res <- ps Nothing
    case res of
      Left _ -> return () -- Allow failure if no models are running
      Right (RunningModels (m : _)) -> do
        assertBool "name_ should not be empty" (not $ T.null $ name_ m)
        assertBool "modelName should not be empty" (not $ T.null $ modelName m)
        assertBool "modelDigest should not be empty" (not $ T.null $ modelDigest m)
        assertBool "size_ should be positive" (size_ m > 0)
        assertBool "sizeVRam should be non-negative" (sizeVRam m >= 0)
      Right _ -> return () -- If empty, that's acceptable
  
  tests :: TestTree
  tests =
    testGroup
      "show model tests"
      [ testShowModelBasic
      , testShowModelVerbose
      , testPsBasic
      , testPsModelFields
      ]
  