module Stackctl.Spec.List
  ( ListOptions(..)
  , parseListOptions
  , runList
  ) where

import Stackctl.Prelude

import Blammo.Logging.Logger (pushLoggerLn)
import Options.Applicative
import Stackctl.AWS
import Stackctl.AWS.Scope
import Stackctl.Colors
import Stackctl.Config (HasConfig)
import Stackctl.DirectoryOption (HasDirectoryOption(..))
import Stackctl.FilterOption (HasFilterOption)
import Stackctl.Spec.Discover
import Stackctl.StackSpec

data ListOptions = ListOptions

-- brittany-disable-next-binding

parseListOptions :: Parser ListOptions
parseListOptions = pure ListOptions

runList
  :: ( MonadUnliftIO m
     , MonadMask m
     , MonadResource m
     , MonadLogger m
     , MonadReader env m
     , HasAwsScope env
     , HasAwsEnv env
     , HasLogger env
     , HasConfig env
     , HasDirectoryOption env
     , HasFilterOption env
     )
  => ListOptions
  -> m ()
runList _ = do
  specs <- discoverSpecs
  Colors {..} <- getColorsLogger

  for_ specs $ \spec -> do
    let
      path = stackSpecFilePath spec
      name = stackSpecStackName spec

    exists <- isJust <$> awsCloudFormationDescribeStackMaybe name

    let
      formatted :: Text
      formatted =
        "  "
          <> (if exists then green "✓ " else yellow "✗ ")
          <> cyan (unStackName name)
          <> " => "
          <> magenta (pack path)

    pushLoggerLn formatted