module Items.ItemEffects
    (noEffect,
     hurtEffect,
     winEffect,
     walkEffect,
     springBootsEffect,
     hairDryerEffect,
     speedBootsEffect,
     rainBootsEffect,
     ponchoEffect,
     shieldEffect,
     umbrellaEffect,
     fallUmbrellaEffect,
     upsUmbrellaEffect,
     upsUmbrellaEffect2,
     skateboardEffect,
     pogostickEffect,
     pogostickEffect2,
     wrenchEffect) where

import Data.Maybe
import Nxt.Types
import Cat.Cat
import Settings.CatSettings as CatSettings

-- No Effect
noEffect :: Cat -> Cat
noEffect cat = cat

-- Walk
walkEffect :: Cat -> Cat
walkEffect cat =
    let walkTex = walkTextures $ catAnimations cat
        in cat {catTexture = walkTex, catItemName = "NoItem", catItemDuration = Nothing}

-- Hurt
hurtEffect :: Cat -> Cat
hurtEffect cat =
    let hurtTex = hurtTextures $ catAnimations cat
        in if catItemName cat /= "Hurt"
              then updateCatVel (cat {catTexture = hurtTex, catItemName = "Hurt", catItemDuration = Just 120}) (0.0, 0.0)
              else updateCatVel cat (0.0, 0.0)

-- Win
winEffect :: Cat -> Cat
winEffect cat =
    let winTex = idleTextures $ catAnimations cat
        in if catItemName cat /= "Win"
              then updateCatVel (cat {catTexture = winTex, catItemName = "Win", catItemDuration = Just 120}) (0.0, 0.0)
              else updateCatVel cat (0.0, 0.0)

-- Spring Boots
springBootsEffect :: Cat -> Cat
springBootsEffect cat =
    let springBootsTex = springBootsTextures $ catAnimations cat
        vel = (fst $ catVelocity cat, CatSettings.catSpringVelY)
        in updateCatVel (cat {catTexture = springBootsTex, catItemName = "SpringBoots",
                              catItemDuration = Nothing}) vel

-- Hair Dryer
hairDryerEffect :: Cat -> Cat
hairDryerEffect cat =
    let (velX, velY) = catVelocity cat
    in updateCatVel cat (-velX, velY)

-- Speed Boots
speedBootsEffect :: Cat -> Cat
speedBootsEffect cat =
    let speedBootsTex = speedBootsTextures $ catAnimations cat
        vel = (case catDirection cat of
                  DirRight -> CatSettings.catSpeedVelX
                  DirLeft -> -CatSettings.catSpeedVelX,
               snd $ catVelocity cat)
    in updateCatVel (cat {catTexture = speedBootsTex, catItemName = "SpeedBoots",
                          catItemDuration = Just CatSettings.catSpeedDuration}) vel

-- Rain Boots
rainBootsEffect :: Cat -> Cat
rainBootsEffect cat =
    let rainBootsTex = rainBootsTextures $ catAnimations cat
        in cat {catTexture = rainBootsTex, catItemName = "RainBoots",
                catItemDuration = Just CatSettings.catRainDuration}

-- Poncho
ponchoEffect :: Cat -> Cat
ponchoEffect cat =
    let ponchoTex = ponchoTextures $ catAnimations cat
    in cat {catTexture = ponchoTex, catItemName = "Poncho",
            catItemDuration = Just CatSettings.catPonchoDuration}

-- Shield
shieldEffect :: Cat -> Cat
shieldEffect cat =
    let shieldTex = shieldTextures $ catAnimations cat
    in cat {catTexture = shieldTex, catItemName = "Shield",
            catItemDuration = Just CatSettings.catShieldDuration}

-- Umbrella
umbrellaEffect :: Cat -> Cat
umbrellaEffect cat =
    let umbrellaTex = umbrellaTextures $ catAnimations cat
    in cat {catTexture = umbrellaTex, catItemName = "Umbrella",
            catItemDuration = Just CatSettings.catUmbrellaDuration}

fallUmbrellaEffect :: Cat -> Cat
fallUmbrellaEffect cat =
    let fallUmbrellaTex = fallUmbrellaTextures $ catAnimations cat
        catVel = (fst $ catVelocity cat, CatSettings.catFallUmbrellaVelY)
        itemDur = if isNothing (catItemDuration cat)
                     then Just CatSettings.catUmbrellaDuration
                     else catItemDuration cat
    in cat {catTexture = fallUmbrellaTex, catItemName = "FallUmbrella",
            catItemDuration = itemDur, catVelocity = catVel}

-- Upsidedown Umbrella
upsUmbrellaEffect :: Cat -> Cat
upsUmbrellaEffect cat =
    cat {catItemName = "UpsUmbrella", catItemDuration = Nothing}

upsUmbrellaEffect2 :: Cat -> Cat
upsUmbrellaEffect2 cat =
    let upsUmbrellaTex = upsUmbrellaTextures $ catAnimations cat
        catVel = (fst $ catVelocity cat, 0.0)
        in cat {catTexture = upsUmbrellaTex, catItemName = "UpsUmbrellaActive",
                catItemDuration = Nothing, catVelocity = catVel}

-- Skateboard
skateboardEffect :: Cat -> Cat
skateboardEffect cat =
    let skateboardTex = skateboardTextures $ catAnimations cat
        vel = (case catDirection cat of
                    DirRight -> CatSettings.catSkateVelX
--                    DirLeft -> (-CatSettings.catSkateVelX),
--               snd (catVelocity cat))
                    DirLeft -> -CatSettings.catSkateVelX,snd (catVelocity cat))
    in updateCatVel (cat {catTexture = skateboardTex, catItemName = "Skateboard",
                          catItemDuration = Just CatSettings.catSkateDuration}) vel

-- Pogostick
pogostickEffect :: Cat -> Cat
pogostickEffect cat =
    cat {catItemName = "Pogostick", catItemDuration = Nothing}

pogostickEffect2 :: Cat -> Cat
pogostickEffect2 cat =
    let pogostickTex = pogostickTextures $ catAnimations cat
    in cat {catTexture = pogostickTex, catItemDuration = Nothing}

-- Wrench
wrenchEffect :: Cat -> Cat
wrenchEffect cat =
    cat {catItemName = "Wrench", catItemDuration = Nothing}

