{-# LANGUAGE GADTs #-}

-- | LaCroix types and some "/helpful/" functions.
-- 
--   'LaCroix' is pronounced 'La-CROY'. It rhymes with 'enjoy'.
module Lacroix
  ( LaCroix(..)
  , Flavor(..)
  , Curate(..)
  , NiCola(..)
  , flavorDescription
  , curateDescription
  , niColaDescription
  , laCroixDesciption
  , pronunciation 
  ) where

-- | Original LaCroix flavors.
data Flavor
  = Pure
  | Lime
  | Lemon
  | Orange
  | Berry
  | CranRaspberry
  | Pamplemousse
  | PeachPear
  | Coconut
  | Apricot
  | PassionFruit
  | Mango
  | Tangerine
  | KeyLime
  deriving (Bounded, Enum, Eq, Show)

-- | Cúrate LaCroix flavors.
data Curate
  = PommeBaya
  | CeriseLimon
  | PinaFraise
  | KiwiSandia
  | MelonPomelo
  | MurePepino
  deriving (Bounded, Enum, Eq, Show)

-- | NiCola LaCroix flavors.
data NiCola
  = LaCola
  deriving (Bounded, Enum, Eq, Show)

-- | LaCroix type.
data LaCroix where
  LaCroix       :: Flavor -> LaCroix
  LaCroixCurate :: Curate -> LaCroix
  LaCroixNiCola :: NiCola -> LaCroix

-- | Describe a 'LaCroix'.
laCroixDesciption :: LaCroix -> String
laCroixDesciption (LaCroix       flava    ) = flavorDescription flava
laCroixDesciption (LaCroixCurate flavaFlav) = curateDescription flavaFlav
laCroixDesciption (LaCroixNiCola bigClock )  = niColaDescription bigClock

-- | Describe a 'Flavor'.
flavorDescription :: Flavor -> String
flavorDescription flava =
  case flava of
    Pure -> "Pure: crisp, clean, and clear, the blue can is pure,\n" ++ "our only unflavored sparkling."
    Lime -> "Lime: is as good as it looks, always a crowd\n" ++ "pleaser."
    Lemon -> "Lemon: tastes better as a sparkling water, no\n" ++ "seeds or soggy fruit floater."
    Orange -> "Orange: the more things change the more they\n" ++ "stay the same as this tangy flavor is a fan\n" ++ "favorite!"
    Berry -> "Berry: hopefully you're switching to sparkling\n" ++ "because it's berry delicious!"
    CranRaspberry -> "Cran-Raspberry: a mixture of two great tastes\n" ++ "that's berry delightful with nothing artificial."
    Pamplemousse -> "Pamplemousse: it's the French translation for\n" ++ "the word grapefruit and show of humor from\n" ++ "this all-American brand."
    PeachPear -> "Peach Pear: combines the sweet smell of peach\n" ++ "with a rounded pear taste."
    Coconut -> "Coconut: summer in a can is great as a\n" ++ "mixer."
    Apricot -> "Apricot: is a 2014 new addition to the family\n" ++ "which brings a never-been-done-before flavor\n" ++ "to the sparkling water aisle!"
    PassionFruit -> "PassionFruit now available nationwide! Check\n" ++ "your local retailers as our newest flavor is added\n" ++ "to store shelves throught early 2015"
    Mango -> "Mango: another new flavor for 2014, mangos\n" ++ "are green on the outside with a slightly red hue\n" ++ "on top when ripe, thus the can colors."
    Tangerine -> "Tangerine: freshly peeled aroma and Tangerr-\n" ++ "EEN effervescence to transport your taste buds!\n" ++ "Available now in select markets."
    KeyLime -> "Starts with a creamy note of toasted meringue,\n" ++ "followed by the tart, crisp KeyLime essence,\n" ++ "trailing with a rich, graham cracker finish."

-- | Describe a 'Curate'.
curateDescription :: Curate -> String
curateDescription flavaFlav =
  case flavaFlav of
    PommeBaya -> "Pomme Bayá: Translates to Apple-Berry. The\n" ++ "second of two new fantastique flavors inspired\n" ++ "by two cultures, French & Spanish. With bolder\n" ++ "flavors than others, and new tall cans too!"
    CeriseLimon -> "Cerise Limón: Translates to Cherry Lime. One of\n" ++ "two new fantastique flavors inspired by two\n" ++ "cultures, French & Spanish. With bolder flavor\n" ++ "than others, and new tall cans too!"
    PinaFraise -> "Piña Fraise: Translates to Pineapple Strawberry.\n" ++ "The newest fantastique flavor inspired by two\n" ++ "cultures, French & Spanish. With bolder flavors\n" ++ "than others, and new tall cans too!"
    KiwiSandia -> "freshly cut, bright watermelon wedges and juicy\n" ++ "slices of kiwi … now that is a perfect pairing!"
    MelonPomelo -> "ripe cantaloupe essence infused with pink\n" ++ "grapefruit… a tangy duo with a touch of\n" ++ "sweetness!"
    MurePepino -> "sweet & sour blackberry notes and the natural\n" ++ "earthiness of crisp cucumber create this unique\n" ++ "new flavor combination"

-- | Describe a 'NiCola'.
niColaDescription :: NiCola -> String
niColaDescription bigClock =
  case bigClock of
    LaCola -> "The first of its kind, a revolutionary experience…\n" ++ "Natural cola *essenced* sparkling water\n" ++ "completely Innocent!\n\n" ++ "0 - Calorie\n" ++ "0 - Sweetener\n" ++ "0 - Sodium\n" ++ "= INNOCENT!" 

-- | Instructions for how to pronounce a 'LaCroix'.
pronunciation :: LaCroix -> String
pronunciation (LaCroix       _) = "La-CROY, rhymes with enjoy."
pronunciation (LaCroixCurate _) = "La-CROY, rhymes with enjoy.\n" ++ "Cúrate is COO-rah-tay."
pronunciation (LaCroixNiCola _) = "La-CROY, rhymes with enjoy.\n" ++ "Nih-Cola."