module ACME.Yes.PreCure5.GoGo.Profiles
  ( PreCure5GoGo(..)
  , allPrecures
  , introducesHerselfAs
  , transformationPhraseOf
  , metamorphoseOf
  ) where

import ACME.Yes.PreCure5.Class
import ACME.Yes.PreCure5.Profiles

import qualified Data.Set as S

data PreCure5GoGo =
  PreCure5 PreCure5 | MilkyRose
  deriving (Show, Eq, Ord)

instance PreCure PreCure5GoGo where
  allPrecures = S.insert MilkyRose ( S.map PreCure5 allPrecures )

  introducesHerselfAs (PreCure5 p) = introducesHerselfAs p
  introducesHerselfAs MilkyRose    = "青いバラは秘密のしるし! ミルキィローズ!"

  transformationPhraseOf ps = yes ++ rose
    where
      (roses, p5) = S.partition (== MilkyRose) ps
      yes  = if S.null p5    then "" else transformationPhraseOf $ S.map toPreCure5 p5
      rose = if S.null roses then "" else milyRoseTransformation
      milyRoseTransformation =
           "スカイローズ・トランスレイト!\n"
        ++ introducesHerselfAs MilkyRose ++ "\n"

toPreCure5 :: PreCure5GoGo -> PreCure5
toPreCure5 (PreCure5 p) = p
toPreCure5 MilkyRose = error "MilkyRose isn't a character of Yes! PreCure 5"