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

module ACME.PreCure.Textbook.HappinessCharge.Types where


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


data Megumi = Megumi deriving (Eq, Show)
data Hime   = Hime deriving (Eq, Show)
data Yuko   = Yuko deriving (Eq, Show)
data Iona   = Iona deriving (Eq, Show)

girlInstance [t| Megumi |] girlName_Megumi
girlInstance [t| Hime |] girlName_Hime
girlInstance [t| Yuko |] girlName_Yuko
girlInstance [t| Iona |] girlName_Iona

data CureLovely   = CureLovely deriving (Eq, Show)
data CurePrincess = CurePrincess deriving (Eq, Show)
data CureHoney    = CureHoney deriving (Eq, Show)
data CureFortune  = CureFortune deriving (Eq, Show)

data CureLovely_InnocentForm   = CureLovely_InnocentForm deriving (Eq, Show)
data CurePrincess_InnocentForm = CurePrincess_InnocentForm deriving (Eq, Show)
data CureHoney_InnocentForm    = CureHoney_InnocentForm deriving (Eq, Show)
data CureFortune_InnocentForm  = CureFortune_InnocentForm deriving (Eq, Show)

data PreChanMirror pc = PreChanMirror pc deriving (Eq, Show)
data FortunePiano pc = FortunePiano pc deriving (Eq, Show)

-- TODO: Make more PreCards
data PreCard_Lovely   = PreCard_Lovely deriving (Eq, Show)
data PreCard_Princess = PreCard_Princess deriving (Eq, Show)
data PreCard_Honey    = PreCard_Honey deriving (Eq, Show)
data PreCard_Fortune  = PreCard_Fortune deriving (Eq, Show)

data PreCard_Lovely_InnocentForm   = PreCard_Lovely_InnocentForm deriving (Eq, Show)
data PreCard_Princess_InnocentForm = PreCard_Princess_InnocentForm deriving (Eq, Show)
data PreCard_Honey_InnocentForm    = PreCard_Honey_InnocentForm deriving (Eq, Show)
data PreCard_Fortune_InnocentForm  = PreCard_Fortune_InnocentForm deriving (Eq, Show)

data LovePreBrace = LovePreBrace deriving (Eq, Show)
data TripleDanceHoneyBaton = TripleDanceHoneyBaton deriving (Eq, Show)
data FortuneTambourine = FortuneTambourine deriving (Eq, Show)

data ShiningMakeDresser = ShiningMakeDresser deriving (Eq, Show)
data InnocentHarmonyMic = InnocentHarmonyMic deriving (Eq, Show)

transformedInstanceDefault [t| CureLovely |] cureName_Lovely introducesHerselfAs_Lovely
transformedInstanceDefault [t| CurePrincess |] cureName_Princess introducesHerselfAs_Princess
transformedInstanceDefault [t| CureHoney |] cureName_Honey introducesHerselfAs_Honey
transformedInstanceDefault [t| CureFortune |] cureName_Fortune introducesHerselfAs_Fortune

transformedInstance [t| CureLovely_InnocentForm |] cureName_Lovely introducesHerselfAs_Lovely variation_InnocentForm
transformedInstance [t| CurePrincess_InnocentForm |] cureName_Princess introducesHerselfAs_Princess variation_InnocentForm
transformedInstance [t| CureHoney_InnocentForm |] cureName_Honey introducesHerselfAs_Honey variation_InnocentForm
transformedInstance [t| CureFortune_InnocentForm |] cureName_Fortune introducesHerselfAs_Fortune variation_InnocentForm

transformedGroupInstanceDefault
  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
  groupName_HappinessCharge

transformedGroupInstance
  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
  groupName_HappinessCharge
  variation_InnocentForm

transformationInstance [t| Megumi |] [t| PreChanMirror PreCard_Lovely |] [t| CureLovely |] [| CureLovely |] transformationSpeech_Lovely
transformationInstance [t| Hime |] [t| PreChanMirror PreCard_Princess |] [t| CurePrincess |] [| CurePrincess |] transformationSpeech_Princess
transformationInstance [t| Yuko |] [t| PreChanMirror PreCard_Honey |] [t| CureHoney |] [| CureHoney |] transformationSpeech_Honey
transformationInstance [t| Iona |] [t| FortunePiano PreCard_Fortune |] [t| CureFortune |] [| CureFortune |] transformationSpeech_Fortune

transformationInstance
  [t| (Megumi, Hime) |]
  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess) |]
  [t| (CureLovely, CurePrincess) |]
  [| (CureLovely, CurePrincess) |]
  transformationSpeech_Lovely_Princess

transformationInstance
  [t| (Megumi, Hime, Yuko) |]
  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess, PreChanMirror PreCard_Honey) |]
  [t| (CureLovely, CurePrincess, CureHoney) |]
  [| (CureLovely, CurePrincess, CureHoney) |]
  transformationSpeech_Lovely_Princess_Honey

transformationInstance
  [t| (Megumi, Hime, Yuko, Iona) |]
  [t| (PreChanMirror PreCard_Lovely, PreChanMirror PreCard_Princess, PreChanMirror PreCard_Honey, FortunePiano PreCard_Fortune) |]
  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
  [| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
  transformationSpeech_HappinessCharge

transformationInstance
  [t| (CureLovely, CurePrincess, CureHoney, CureFortune) |]
  [t| (PreChanMirror PreCard_Lovely_InnocentForm, PreChanMirror PreCard_Princess_InnocentForm, PreChanMirror PreCard_Honey_InnocentForm, FortunePiano PreCard_Fortune_InnocentForm) |]
  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
  [| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
  transformationSpeech_HappinessCharge_InnocentForm

purificationInstance [t| CureLovely |] [t| LovePreBrace |] purificationSpeech_Lovely
purificationInstance [t| CurePrincess |] [t| LovePreBrace |] purificationSpeech_Princess
purificationInstance [t| CureHoney |] [t| TripleDanceHoneyBaton |] purificationSpeech_Honey
purificationInstance [t| CureFortune |] [t| FortuneTambourine |] purificationSpeech_Fortune

purificationInstance
  [t| (CureLovely_InnocentForm, CurePrincess_InnocentForm, CureHoney_InnocentForm, CureFortune_InnocentForm) |]
  [t| (ShiningMakeDresser, InnocentHarmonyMic) |]
  purificationSpeech_HappinessCharge_InnocentForm