{-# LANGUAGE DeriveGeneric #-}

module SuperUserSpark.Check.Types where

import Import

import SuperUserSpark.Bake.Types
import SuperUserSpark.Diagnose.Types

data CheckAssignment = CheckAssignment
    { checkCardReference :: BakeCardReference
    , checkSettings :: CheckSettings
    } deriving (Show, Eq, Generic)

instance Validity CheckAssignment

newtype CheckSettings = CheckSettings
    { checkDiagnoseSettings :: DiagnoseSettings
    } deriving (Show, Eq, Generic)

instance Validity CheckSettings

defaultCheckSettings :: CheckSettings
defaultCheckSettings =
    CheckSettings {checkDiagnoseSettings = defaultDiagnoseSettings}

type SparkChecker = ExceptT CheckError (ReaderT CheckSettings IO)

data CheckError
    = CheckDiagnoseError DiagnoseError
    | CheckError String
    deriving (Show, Eq, Generic)

instance Validity CheckError

data Instruction
    = CopyFile (Path Abs File)
               (Path Abs File)
    | CopyDir (Path Abs Dir)
              (Path Abs Dir)
    | LinkFile (Path Abs File)
               (Path Abs File)
    | LinkDir (Path Abs Dir)
              (Path Abs Dir)
    deriving (Show, Eq, Generic)

instance Validity Instruction

data CleanupInstruction
    = CleanFile (Path Abs File)
    | CleanDirectory (Path Abs Dir)
    | CleanLink (Path Abs File)
    deriving (Show, Eq, Generic)

instance Validity CleanupInstruction

data DeploymentCheckResult
    = DeploymentDone -- ^ Done already
    | ReadyToDeploy Instruction -- ^ Immediately possible
    | DirtySituation String
                     Instruction
                     CleanupInstruction -- ^ Possible after cleanup of destination
    | ImpossibleDeployment [String] -- ^ Entirely impossible
    deriving (Show, Eq, Generic)

instance Validity DeploymentCheckResult

data CheckResult
    = AlreadyDone -- ^ Done already
    | Ready Instruction -- ^ Immediately possible
    | Dirty String
            Instruction
            CleanupInstruction -- ^ Possible after cleanup
    | Impossible String -- ^ Entirely impossible
    deriving (Show, Eq, Generic)

instance Validity CheckResult