{- 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
    { Dish -> Option
option :: Ir.Option
    , Dish -> FilePath
dockerfilePath :: FilePath
    , Dish -> Metadata
metadata :: Metadata
    , Dish -> Maybe Text
healthCheck :: Maybe T.Text
    }
  deriving (Dish -> Dish -> Bool
(Dish -> Dish -> Bool) -> (Dish -> Dish -> Bool) -> Eq Dish
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Dish -> Dish -> Bool
$c/= :: Dish -> Dish -> Bool
== :: Dish -> Dish -> Bool
$c== :: Dish -> Dish -> Bool
Eq, (forall x. Dish -> Rep Dish x)
-> (forall x. Rep Dish x -> Dish) -> Generic Dish
forall x. Rep Dish x -> Dish
forall x. Dish -> Rep Dish x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Dish x -> Dish
$cfrom :: forall x. Dish -> Rep Dish x
Generics.Generic, Eq Dish
Eq Dish
-> (Dish -> Dish -> Ordering)
-> (Dish -> Dish -> Bool)
-> (Dish -> Dish -> Bool)
-> (Dish -> Dish -> Bool)
-> (Dish -> Dish -> Bool)
-> (Dish -> Dish -> Dish)
-> (Dish -> Dish -> Dish)
-> Ord Dish
Dish -> Dish -> Bool
Dish -> Dish -> Ordering
Dish -> Dish -> Dish
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Dish -> Dish -> Dish
$cmin :: Dish -> Dish -> Dish
max :: Dish -> Dish -> Dish
$cmax :: Dish -> Dish -> Dish
>= :: Dish -> Dish -> Bool
$c>= :: Dish -> Dish -> Bool
> :: Dish -> Dish -> Bool
$c> :: Dish -> Dish -> Bool
<= :: Dish -> Dish -> Bool
$c<= :: Dish -> Dish -> Bool
< :: Dish -> Dish -> Bool
$c< :: Dish -> Dish -> Bool
compare :: Dish -> Dish -> Ordering
$ccompare :: Dish -> Dish -> Ordering
$cp1Ord :: Eq Dish
Ord, Int -> Dish -> ShowS
[Dish] -> ShowS
Dish -> FilePath
(Int -> Dish -> ShowS)
-> (Dish -> FilePath) -> ([Dish] -> ShowS) -> Show Dish
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Dish] -> ShowS
$cshowList :: [Dish] -> ShowS
show :: Dish -> FilePath
$cshow :: Dish -> FilePath
showsPrec :: Int -> Dish -> ShowS
$cshowsPrec :: Int -> Dish -> ShowS
Show)

instance Aeson.ToJSON Dish where
  toJSON :: Dish -> Value
toJSON = Options -> Dish -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
TextTools.defaultJsonOptions

data Metadata =
  Metadata
    { Metadata -> Text
title :: T.Text
    , Metadata -> Text
url :: T.Text
    , Metadata -> Map TagKey [TagValue]
tags :: Map.Map Ir.TagKey [Ir.TagValue]
    }
  deriving (Metadata -> Metadata -> Bool
(Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool) -> Eq Metadata
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Metadata -> Metadata -> Bool
$c/= :: Metadata -> Metadata -> Bool
== :: Metadata -> Metadata -> Bool
$c== :: Metadata -> Metadata -> Bool
Eq, (forall x. Metadata -> Rep Metadata x)
-> (forall x. Rep Metadata x -> Metadata) -> Generic Metadata
forall x. Rep Metadata x -> Metadata
forall x. Metadata -> Rep Metadata x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep Metadata x -> Metadata
$cfrom :: forall x. Metadata -> Rep Metadata x
Generics.Generic, Eq Metadata
Eq Metadata
-> (Metadata -> Metadata -> Ordering)
-> (Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Bool)
-> (Metadata -> Metadata -> Metadata)
-> (Metadata -> Metadata -> Metadata)
-> Ord Metadata
Metadata -> Metadata -> Bool
Metadata -> Metadata -> Ordering
Metadata -> Metadata -> Metadata
forall a.
Eq a
-> (a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
min :: Metadata -> Metadata -> Metadata
$cmin :: Metadata -> Metadata -> Metadata
max :: Metadata -> Metadata -> Metadata
$cmax :: Metadata -> Metadata -> Metadata
>= :: Metadata -> Metadata -> Bool
$c>= :: Metadata -> Metadata -> Bool
> :: Metadata -> Metadata -> Bool
$c> :: Metadata -> Metadata -> Bool
<= :: Metadata -> Metadata -> Bool
$c<= :: Metadata -> Metadata -> Bool
< :: Metadata -> Metadata -> Bool
$c< :: Metadata -> Metadata -> Bool
compare :: Metadata -> Metadata -> Ordering
$ccompare :: Metadata -> Metadata -> Ordering
$cp1Ord :: Eq Metadata
Ord, Int -> Metadata -> ShowS
[Metadata] -> ShowS
Metadata -> FilePath
(Int -> Metadata -> ShowS)
-> (Metadata -> FilePath) -> ([Metadata] -> ShowS) -> Show Metadata
forall a.
(Int -> a -> ShowS) -> (a -> FilePath) -> ([a] -> ShowS) -> Show a
showList :: [Metadata] -> ShowS
$cshowList :: [Metadata] -> ShowS
show :: Metadata -> FilePath
$cshow :: Metadata -> FilePath
showsPrec :: Int -> Metadata -> ShowS
$cshowsPrec :: Int -> Metadata -> ShowS
Show)

instance Aeson.ToJSON Metadata where
  toJSON :: Metadata -> Value
toJSON = Options -> Metadata -> Value
forall a.
(Generic a, GToJSON' Value Zero (Rep a)) =>
Options -> a -> Value
Aeson.genericToJSON Options
TextTools.defaultJsonOptions

get :: Ir.Buffet -> [Dish]
get :: Buffet -> [Dish]
get = ((Option, Dish) -> Dish) -> [(Option, Dish)] -> [Dish]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap ((Option -> Dish -> Dish) -> (Option, Dish) -> Dish
forall a b c. (a -> b -> c) -> (a, b) -> c
uncurry Option -> Dish -> Dish
transformDish) ([(Option, Dish)] -> [Dish])
-> (Buffet -> [(Option, Dish)]) -> Buffet -> [Dish]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Map Option Dish -> [(Option, Dish)]
forall k a. Map k a -> [(k, a)]
Map.toAscList (Map Option Dish -> [(Option, Dish)])
-> (Buffet -> Map Option Dish) -> Buffet -> [(Option, Dish)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Buffet -> Map Option Dish
Ir.optionToDish

transformDish :: Ir.Option -> Ir.Dish -> Dish
transformDish :: Option -> Dish -> Dish
transformDish Option
option' Dish
dish =
  Dish :: Option -> FilePath -> Metadata -> Maybe Text -> Dish
Dish
    { option :: Option
option = Option
option'
    , dockerfilePath :: FilePath
dockerfilePath = Dish -> FilePath
Ir.dockerfilePath Dish
dish
    , metadata :: Metadata
metadata = Metadata -> Metadata
transformMetadata (Metadata -> Metadata) -> Metadata -> Metadata
forall a b. (a -> b) -> a -> b
$ Dish -> Metadata
Ir.metadata Dish
dish
    , healthCheck :: Maybe Text
healthCheck = Dish -> Maybe Text
Ir.healthCheck Dish
dish
    }

transformMetadata :: Ir.Metadata -> Metadata
transformMetadata :: Metadata -> Metadata
transformMetadata Metadata
metadata' =
  Metadata :: Text -> Text -> Map TagKey [TagValue] -> Metadata
Metadata
    { title :: Text
title = Metadata -> Text
Ir.title Metadata
metadata'
    , url :: Text
url = Metadata -> Text
Ir.url Metadata
metadata'
    , tags :: Map TagKey [TagValue]
tags = Metadata -> Map TagKey [TagValue]
Ir.tags Metadata
metadata'
    }