-- 1. Definition der magischen Wesen
data MagicalCreature = Dragon String Int Int
                     | Unicorn String Int Int
                     | Wizard String Int Int
                    deriving (Show)

-- 2. Beschreibung der magischen Wesen
describeMagicalCreature :: MagicalCreature -> String
describeMagicalCreature (Dragon name level experience) = name ++ " ist ein Drache mit Magielevel " ++ show level ++ " und " ++ show experience ++ " Erfahrungspunkten."
describeMagicalCreature (Unicorn name level experience) = name ++ " ist ein Einhorn mit Magielevel " ++ show level ++ " und " ++ show experience ++ " Erfahrungspunkten."
describeMagicalCreature (Wizard name level experience) = name ++ " ist ein Zauberer mit Magielevel " ++ show level ++ " und " ++ show experience ++ " Erfahrungspunkten."

-- 3. Kräfte
class Fighter a where
  power :: a -> Int

instance Fighter MagicalCreature where
    power (Dragon _ level experience) = (level + experience) * 3
    power (Unicorn _ level experience) = (level + experience) * 4
    power (Wizard _ level experience) = (level + experience) * 5

-- 4. Magisches Duell
duel :: (Fighter a) => a -> a -> Either String a
duel fighter1 fighter2
  | power fighter1 > power fighter2 = Right fighter1
  | power fighter1 < power fighter2 = Right fighter2
  | otherwise = Left "Unentschieden!"
