{-# LANGUAGE DeriveAnyClass #-}
{-# LANGUAGE StandaloneDeriving #-}

module Hercules.API.Agent.Evaluate.EvaluateTask where

import Data.Aeson
  ( FromJSON,
    ToJSON,
  )
import Data.Map (Map)
import Data.Swagger (ToSchema)
import Data.Text (Text)
import GHC.Generics (Generic)
import Hercules.API.Id
import Hercules.API.Task (Task)
import Prelude

data EvaluateTask
  = EvaluateTask
      { id :: Id (Task EvaluateTask),
        primaryInput :: Text, -- HTTP URL
        otherInputs :: Map Identifier Text, -- identifier -> HTTP URL
        autoArguments :: Map Text (SubPathOf Identifier), -- argument name -> identifier
        nixPath :: [NixPathElement (SubPathOf Identifier)], -- NIX_PATH element -> identifier
        logToken :: Text
      }
  deriving (Generic, Show, Eq, ToJSON, FromJSON, ToSchema)

type Identifier = Text

data NixPathElement a
  = NixPathElement
      { -- | for example @/home/user/nixpkgs@ in @/home/user/nixpkgs:/etc/nixos/foo@
        prefix :: Maybe Text,
        value :: a
      }
  deriving (Generic, Show, Eq, ToJSON, FromJSON, Functor, Foldable, Traversable)

deriving instance ToSchema a => ToSchema (NixPathElement a)

-- | For using a path inside a source
data SubPathOf a
  = SubPathOf
      { path :: a,
        subPath :: Maybe Text
      }
  deriving (Generic, Show, Eq, ToJSON, FromJSON, Functor, Foldable, Traversable)

deriving instance ToSchema a => ToSchema (SubPathOf a)