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

module ACME.PreCure.Textbook.MahoGirls.Types where

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


data Mirai  = Mirai deriving (Eq, Show)
-- According to the Ep. 40, Liko spells "Liko" instead of "Riko"
data Liko   = Liko deriving (Eq, Show)
data Kotoha = Kotoha deriving (Eq, Show)


$(girlInstance [t| Mirai  |] girlName_Mirai)
$(girlInstance [t| Liko   |] girlName_Liko)
$(girlInstance [t| Kotoha |] girlName_Kotoha)


data CureMiracle                = CureMiracle deriving (Eq, Show)
data CureMiracle_Ruby           = CureMiracle_Ruby deriving (Eq, Show)
data CureMiracle_Sapphire       = CureMiracle_Sapphire deriving (Eq, Show)
data CureMiracle_Topaz          = CureMiracle_Topaz deriving (Eq, Show)
data CureMiracle_OverTheRainbow = CureMiracle_OverTheRainbow deriving (Eq, Show)
data CureMiracle_Heartful       = CureMiracle_Heartful deriving (Eq, Show)

data CureMagical                = CureMagical deriving (Eq, Show)
data CureMagical_Ruby           = CureMagical_Ruby deriving (Eq, Show)
data CureMagical_Sapphire       = CureMagical_Sapphire deriving (Eq, Show)
data CureMagical_Topaz          = CureMagical_Topaz deriving (Eq, Show)
data CureMagical_OverTheRainbow = CureMagical_OverTheRainbow deriving (Eq, Show)
data CureMagical_Heartful       = CureMagical_Heartful deriving (Eq, Show)

data CureFelice                = CureFelice deriving (Eq, Show)
data CureFelice_OverTheRainbow = CureFelice_OverTheRainbow deriving (Eq, Show)
data CureFelice_Heartful       = CureFelice_Heartful deriving (Eq, Show)

data CureMofurun               = CureMofurun deriving (Eq, Show)
data CureMofurun_Ruby          = CureMofurun_Ruby deriving (Eq, Show)
data CureMofurun_Sapphire      = CureMofurun_Sapphire deriving (Eq, Show)
data CureMofurun_Topaz         = CureMofurun_Topaz deriving (Eq, Show)
data CureMofurun_Heartful      = CureMofurun_Heartful deriving (Eq, Show)

data Mofurun ls = Mofurun ls deriving (Eq, Show)

data LinkleSmarthon ls = LinkleSmarthon ls deriving (Eq, Show)

data RainbowCarriage ls mof = RainbowCarriage ls mof deriving (Eq, Show)

data PreciousBrace = PreciousBrace deriving (Eq, Show)

data MiracleMofurunLight = MiracleMofurunLight deriving (Eq, Show)


data LinkleStoneDia         = LinkleStoneDia deriving (Show, Eq)
data LinkleStoneRuby        = LinkleStoneRuby deriving (Show, Eq)
data LinkleStoneSapphire    = LinkleStoneSapphire deriving (Show, Eq)
data LinkleStoneTopaz       = LinkleStoneTopaz deriving (Show, Eq)
data LinkleStoneEmerald     = LinkleStoneEmerald deriving (Show, Eq)
data LinkleStoneAlexandrite = LinkleStoneAlexandrite deriving (Show, Eq)

data LinkleStoneOfHope   = LinkleStoneOfHope deriving (Show, Eq)
data HeartfulLinkleStone = HeartfulLinkleStone deriving (Show, Eq)

data LinkleStick ls = LinkleStick ls deriving (Eq, Show)
data FlowerEchoWand ls = FlowerEchoWand ls deriving (Eq, Show)

transformedInstance [t| CureMiracle                |] cureName_Miracle introducesHerselfAs_Miracle variation_Dia
transformedInstance [t| CureMiracle_Ruby           |] cureName_Miracle introducesHerselfAs_Miracle variation_Ruby
transformedInstance [t| CureMiracle_Sapphire       |] cureName_Miracle introducesHerselfAs_Miracle variation_Sapphire
transformedInstance [t| CureMiracle_Topaz          |] cureName_Miracle introducesHerselfAs_Miracle variation_Topaz
transformedInstance [t| CureMiracle_OverTheRainbow |] cureName_Miracle introducesHerselfAs_Miracle variation_OverTheRainbow
transformedInstance [t| CureMiracle_Heartful       |] cureName_Miracle introducesHerselfAs_Miracle variation_Heartful

transformedInstance [t| CureMagical                |] cureName_Magical introducesHerselfAs_Magical variation_Dia
transformedInstance [t| CureMagical_Ruby           |] cureName_Magical introducesHerselfAs_Magical variation_Ruby
transformedInstance [t| CureMagical_Sapphire       |] cureName_Magical introducesHerselfAs_Magical variation_Sapphire
transformedInstance [t| CureMagical_Topaz          |] cureName_Magical introducesHerselfAs_Magical variation_Topaz
transformedInstance [t| CureMagical_OverTheRainbow |] cureName_Magical introducesHerselfAs_Magical variation_OverTheRainbow
transformedInstance [t| CureMagical_Heartful       |] cureName_Magical introducesHerselfAs_Magical variation_Heartful

transformedInstanceDefault [t| CureFelice |] cureName_Felice introducesHerselfAs_Felice
transformedInstance [t| CureFelice_OverTheRainbow |] cureName_Felice introducesHerselfAs_Felice variation_OverTheRainbow
transformedInstance [t| CureFelice_Heartful       |] cureName_Felice introducesHerselfAs_Felice variation_Heartful

transformedInstance [t| CureMofurun |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Dia

transformedInstance [t| CureMofurun_Ruby |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Ruby

transformedInstance [t| CureMofurun_Sapphire |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Sapphire

transformedInstance [t| CureMofurun_Topaz |] cureName_Mofurun introducesHerselfAs_Mofurun variation_Topaz

transformedGroupInstance
  [t| (CureMiracle, CureMagical) |]
  groupName_MahoGirls
  variation_Dia

transformedGroupInstance
  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
  groupName_MahoGirls
  variation_Ruby

transformedGroupInstance
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
  groupName_MahoGirls
  variation_Sapphire

transformedGroupInstance
  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
  groupName_MahoGirls
  variation_Topaz

transformedGroupInstance
  [t| (CureMiracle, CureMagical, CureFelice) |]
  groupName_MahoGirls
  variation_Dia

transformedGroupInstance
  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
  groupName_MahoGirls
  variation_Ruby

transformedGroupInstance
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
  groupName_MahoGirls
  variation_Sapphire

transformedGroupInstance
  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
  groupName_MahoGirls
  variation_Topaz

transformedGroupInstance
  [t| (CureMiracle, CureMagical, CureFelice, CureMofurun) |]
  groupName_MahoGirls
  variation_Dia

transformedGroupInstance
  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice, CureMofurun_Ruby) |]
  groupName_MahoGirls
  variation_Ruby

transformedGroupInstance
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice, CureMofurun_Sapphire) |]
  groupName_MahoGirls
  variation_Sapphire

transformedGroupInstance
  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice, CureMofurun_Topaz) |]
  groupName_MahoGirls
  variation_Topaz

transformedGroupInstance
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  groupName_MahoGirls
  variation_OverTheRainbow

-- TODO: Add purification instance after watching the movie again
transformedGroupInstance
  [t| (CureMiracle_Heartful, CureMagical_Heartful, CureFelice_Heartful, CureMofurun_Heartful) |]
  groupName_MahoGirls
  variation_Heartful

transformationInstance
  [t| (Mirai, Liko) |]
  [t| (Mofurun LinkleStoneDia) |]
  [t| (CureMiracle, CureMagical) |]
  [| (CureMiracle, CureMagical) |]
  transformationSpeech_Miracle_Magical

transformationInstance
  [t| (Mirai, Liko) |]
  [t| (Mofurun LinkleStoneRuby) |]
  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
  [| (CureMiracle_Ruby, CureMagical_Ruby) |]
  transformationSpeech_Miracle_Magical_Ruby

transformationInstance
  [t| (Mirai, Liko) |]
  [t| (Mofurun LinkleStoneSapphire) |]
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
  [| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
  transformationSpeech_Miracle_Magical_Sapphire

transformationInstance
  [t| (Mirai, Liko) |]
  [t| (Mofurun LinkleStoneTopaz) |]
  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
  [| (CureMiracle_Topaz, CureMagical_Topaz) |]
  transformationSpeech_Miracle_Magical_Topaz

transformationInstance
  [t| Kotoha |]
  [t| (LinkleSmarthon LinkleStoneEmerald) |]
  [t| CureFelice |]
  [| CureFelice |]
  transformationSpeech_Felice

transformationInstance
  [t| (Mirai, Liko, Kotoha) |]
  [t| (Mofurun LinkleStoneDia, LinkleSmarthon LinkleStoneEmerald) |]
  [t| (CureMiracle, CureMagical, CureFelice) |]
  [| (CureMiracle, CureMagical, CureFelice) |]
  transformationSpeech_MahoGirls

transformationInstance
  [t| (Mirai, Liko, Kotoha) |]
  [t| (Mofurun LinkleStoneRuby, LinkleSmarthon LinkleStoneEmerald) |]
  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
  [| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
  transformationSpeech_MahoGirls_Ruby

transformationInstance
  [t| (Mirai, Liko, Kotoha) |]
  [t| (Mofurun LinkleStoneSapphire, LinkleSmarthon LinkleStoneEmerald) |]
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
  [| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
  transformationSpeech_MahoGirls_Sapphire

transformationInstance
  [t| (Mirai, Liko, Kotoha) |]
  [t| (Mofurun LinkleStoneTopaz, LinkleSmarthon LinkleStoneEmerald) |]
  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
  [| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
  transformationSpeech_MahoGirls_Topaz


transformationInstance
  [t| (CureMiracle, CureMagical, CureFelice) |]
  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  transformationSpeech_MahoGirls_OverTheRainbow

transformationInstance
  [t| (CureMiracle_Ruby, CureMagical_Ruby, CureFelice) |]
  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  transformationSpeech_MahoGirls_OverTheRainbow

transformationInstance
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire, CureFelice) |]
  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  transformationSpeech_MahoGirls_OverTheRainbow

transformationInstance
  [t| (CureMiracle_Topaz, CureMagical_Topaz, CureFelice) |]
  [t| (Mofurun LinkleStoneAlexandrite, LinkleSmarthon LinkleStoneAlexandrite) |]
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  [| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  transformationSpeech_MahoGirls_OverTheRainbow

transformationInstance
  [t| Mofurun LinkleStoneOfHope |]
  [t| MiracleMofurunLight |]
  [t| CureMofurun |]
  [| CureMofurun |]
  transformationSpeech_Mofurun


purificationInstance
  [t| (CureMiracle, CureMagical) |]
  [t| (Mofurun LinkleStoneDia, LinkleStick LinkleStoneDia) |]
  purificationSpeech_Miracle_Magical

purificationInstance
  [t| (CureMiracle_Ruby, CureMagical_Ruby) |]
  [t| (Mofurun LinkleStoneRuby, LinkleStick LinkleStoneRuby) |]
  purificationSpeech_Miracle_Magical_Ruby

purificationInstance
  [t| (CureMiracle_Sapphire, CureMagical_Sapphire) |]
  [t| (Mofurun LinkleStoneSapphire, LinkleStick LinkleStoneSapphire) |]
  purificationSpeech_Miracle_Magical_Sapphire

purificationInstance
  [t| (CureMiracle_Topaz, CureMagical_Topaz) |]
  [t| (Mofurun LinkleStoneTopaz, LinkleStick LinkleStoneTopaz) |]
  purificationSpeech_Miracle_Magical_Topaz

purificationInstance
  [t| CureFelice |]
  [t| FlowerEchoWand LinkleStoneEmerald |]
  purificationSpeech_Felice

purificationInstance
  [t| (CureMiracle_OverTheRainbow, CureMagical_OverTheRainbow, CureFelice_OverTheRainbow) |]
  [t| (RainbowCarriage LinkleStoneAlexandrite (Mofurun LinkleStoneAlexandrite), PreciousBrace) |]
  purificationSpeech_MahoGirls_extreme_rainbow