{- HLINT ignore "Avoid restricted extensions" -}
{-# LANGUAGE DeriveGeneric #-}

module Buffet.Document.TemplateDishes
  ( Dish
  , get
  ) where

import qualified Buffet.Ir.Ir as Ir
import qualified Buffet.Toolbox.TextTools as TextTools
import qualified Data.Aeson as Aeson
import qualified Data.Map.Strict as Map
import qualified Data.Text as T
import qualified GHC.Generics as Generics
import Prelude (Eq, FilePath, Maybe, Ord, Show, ($), (.), fmap, uncurry)

data Dish =
  Dish
    { option :: Ir.Option
    , dockerfilePath :: FilePath
    , metadata :: Metadata
    , healthCheck :: Maybe T.Text
    }
  deriving (Eq, Generics.Generic, Ord, Show)

instance Aeson.ToJSON Dish where
  toJSON = Aeson.genericToJSON TextTools.defaultJsonOptions

data Metadata =
  Metadata
    { title :: T.Text
    , url :: T.Text
    , tags :: Map.Map Ir.TagKey [Ir.TagValue]
    }
  deriving (Eq, Generics.Generic, Ord, Show)

instance Aeson.ToJSON Metadata where
  toJSON = Aeson.genericToJSON TextTools.defaultJsonOptions

get :: Ir.Buffet -> [Dish]
get = fmap (uncurry transformDish) . Map.toAscList . Ir.optionToDish

transformDish :: Ir.Option -> Ir.Dish -> Dish
transformDish option' dish =
  Dish
    { option = option'
    , dockerfilePath = Ir.dockerfilePath dish
    , metadata = transformMetadata $ Ir.metadata dish
    , healthCheck = Ir.healthCheck dish
    }

transformMetadata :: Ir.Metadata -> Metadata
transformMetadata metadata' =
  Metadata
    { title = Ir.title metadata'
    , url = Ir.url metadata'
    , tags = Ir.tags metadata'
    }