{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE MultiParamTypeClasses #-}
{-# LANGUAGE TemplateHaskell #-}
{-# LANGUAGE TypeFamilies #-}

module ACME.PreCure.Textbook.Fresh.Types where

import           Data.List
                   ( intercalate
                   )


import           ACME.PreCure.Textbook.Fresh.Words
import           ACME.PreCure.Types.TH


data Love    = Love deriving (Eq, Show)
data Miki    = Miki deriving (Eq, Show)
data Inori   = Inori deriving (Eq, Show)
data Setsuna = Setsuna deriving (Eq, Show)

girlInstance [t| Love |] girlName_Love
girlInstance [t| Miki |] girlName_Miki
girlInstance [t| Inori |] girlName_Inori
girlInstance [t| Setsuna |] girlName_Setsuna

data CurePeach   = CurePeach deriving (Eq, Show)
data CureBerry   = CureBerry deriving (Eq, Show)
data CurePine    = CurePine deriving (Eq, Show)
data CurePassion = CurePassion deriving (Eq, Show)

data Linkrun = Linkrun deriving (Eq, Show)

data CureStickPeachRod = CureStickPeachRod deriving (Eq, Show)
data CureStickBerrySword = CureStickBerrySword deriving (Eq, Show)
data CureStickPineFlute = CureStickPineFlute deriving (Eq, Show)
data PassionHarp = PassionHarp deriving (Eq, Show)

data CloverBox = CloverBox deriving (Eq, Show)

transformedInstanceDefault [t| CurePeach |] cureName_Peach $ intercalate "\n" introducesHerselfAs_Peach
transformedInstanceDefault [t| CureBerry |] cureName_Berry $ intercalate "\n" introducesHerselfAs_Berry
transformedInstanceDefault [t| CurePine |] cureName_Pine $ intercalate "\n" introducesHerselfAs_Pine
transformedInstanceDefault [t| CurePassion |] cureName_Passion $ intercalate "\n" introducesHerselfAs_Passion

transformedGroupInstanceDefault
  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
  groupName_Fresh

transformationInstance [t| Love |] [t| Linkrun |] [t| CurePeach |] [| CurePeach |] transformationSpeech_Peach
transformationInstance [t| Miki |] [t| Linkrun |] [t| CureBerry |] [| CureBerry |] transformationSpeech_Berry
transformationInstance [t| Inori |] [t| Linkrun |] [t| CurePine |] [| CurePine |] transformationSpeech_Pine
transformationInstance [t| Setsuna |] [t| Linkrun |] [t| CurePassion |] [| CurePassion |] transformationSpeech_Passion

transformationInstance
  [t| (Love, Miki, Inori, Setsuna) |]
  [t| Linkrun |]
  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
  [| (CurePeach, CureBerry, CurePine, CurePassion) |]
  transformationSpeech_Fresh

nonItemPurificationInstance [t| CurePeach |] purificationSpeech_Peach
nonItemPurificationInstance [t| CureBerry |] purificationSpeech_Berry
nonItemPurificationInstance [t| CurePine |] purificationSpeech_Pine

purificationInstance [t| CurePeach |] [t| CureStickPeachRod |] purificationSpeech_Peach_Fresh
purificationInstance [t| CureBerry |] [t| CureStickBerrySword |] purificationSpeech_Berry_Fresh
purificationInstance [t| CurePine |] [t| CureStickPineFlute |] purificationSpeech_Pine_Fresh
purificationInstance [t| CurePassion |] [t| PassionHarp |] purificationSpeech_Passion

purificationInstance
  [t| (CurePeach, CureBerry, CurePine, CurePassion) |]
  [t| CloverBox |]
  purificationSpeech_Fresh