module Apicius.AST where

import Data.Monoid ((<>))
import Data.Text (Text)
import Apicius.Util

data Recipe = Recipe
  { rName   :: Text
  , rRecipe :: [Step]
  } deriving (Eq, Show)

instance TShow Recipe where
  text (Recipe name steps) =
    "Recipe { rName = " <>
    text name <>
    ", rRecipe = " <>
    text steps <>
    " }"

data Step = Step
  { sInputs  :: Input
  , sActions :: [Action]
  } deriving (Eq, Show)

instance TShow Step where
  text (Step inp acts) =
    "Step { sInputs = " <>
    text inp <>
    ", sActions = " <>
    text acts <>
    " }"

data Input
  = InpIngredients IngredientList
  | InpJoin Text
    deriving (Eq, Show)

instance TShow Input where
  text (InpJoin ts) = text ts
  text (InpIngredients is) = text is

data IngredientList = IngredientList
  { fromIngredientList :: [Ingredient]
  } deriving (Eq, Show)

instance TShow IngredientList where
  text (IngredientList is) =
    "IngredientList " <> text is

data Ingredient = Ingredient
  { iAmount :: Maybe Text
  , iType   :: Text
  } deriving (Eq, Show)

instance TShow Ingredient where
  text (Ingredient i t) =
    "Ingredient { iAmount = " <>
    text i <>
    ", iType = " <>
    text t <>
    " }"

data Action
  = Action Text (Maybe IngredientList)
  | Join Text
  | Done
    deriving (Eq, Show)

instance TShow Action where
  text (Action t i) = "Action " <> text t <> " " <> text i
  text (Join t) = "Join " <> text t
  text Done = "Done"
