module Buffet.Assemble.ConditionInstructionsInContext
  ( get
  ) where

import qualified Buffet.Assemble.ConditionInstructions as ConditionInstructions
import qualified Buffet.Assemble.HasArgInstructionWithName as HasArgInstructionWithName
import qualified Buffet.Ir.Ir as Ir
import qualified Data.Map.Strict as Map
import Prelude (Bool(False), ($), (.), any, id, maybe, mconcat, pure)

get :: Ir.Buffet -> Ir.Option -> Ir.DockerfilePart -> Ir.DockerfilePart
get buffet option =
  if hasOptionArgInstruction buffet option
    then ConditionInstructions.get configuration
    else id
  where
    configuration =
      ConditionInstructions.Configuration
        { ConditionInstructions.copyDummySourcePath =
            Ir.copyDummySourcePath buffet
        , ConditionInstructions.option = option
        }

hasOptionArgInstruction :: Ir.Buffet -> Ir.Option -> Bool
hasOptionArgInstruction buffet option =
  maybe False hasOptionArg . Map.lookup option $ Ir.optionToDish buffet
  where
    hasOptionArg = any (HasArgInstructionWithName.get option) . parts
    parts dish =
      mconcat
        [ pure $ Ir.beforeFirstBuildStage dish
        , Ir.localBuildStages dish
        , pure $ Ir.globalBuildStage dish
        ]