module Dodge.Item.Weapon.Remote
    ( pointToItem
    , retireRemoteProj
    , setRemoteScope
    , setRemoteBombScope
    ) where
import Dodge.Data
import Dodge.Default
import Geometry
import Dodge.Item.Location

import qualified Data.IntMap.Strict as IM
import Control.Lens
import Data.Maybe

retireRemoteProj :: (Item -> Creature -> World -> World) 
    -> Int -> Int -> Int -> World -> World
retireRemoteProj resetFire itid 0 pjid w = w
    & pointToItem (_itemPositions w IM.! itid) %~ 
        ( (itScope . scopePos .~ V2 0 0)
        . (itUse . rUse .~ resetFire)
        )
    & props %~ IM.delete pjid
retireRemoteProj resetFire itid t pjid w = setScope w 
    & props . ix pjid . pjUpdate .~ (\_ -> retireRemoteProj resetFire itid (t-1) pjid)
  where
    setScope w' = case _itemPositions w' IM.! itid of
        InInv cid invid -> w' 
            & creatures . ix cid . crInv . ix invid . itScope 
                    . scopePos .~ (pos -.- _crPos (_creatures w' IM.! cid))
        _   -> w'
    pos = fromMaybe (V2 0 0) $ w ^? props . ix pjid . prPos

setRemoteBombScope :: Int -> Prop -> World -> World
setRemoteBombScope itid pj w' = case _itemPositions w' IM.! itid of
    InInv cid invid 
        -> w' & creatures . ix cid . crInv . ix invid . itScope 
                . scopePos .~ (_prPos pj -.- _crPos (_creatures w' IM.! cid))
              & creatures . ix cid . crInv . ix invid . itUse . useAim . aimZoom 
                    .~ (defaultItZoom {_itZoomMax = 0.5, _itZoomMin = 0.5})
    _   -> w'

setRemoteScope :: Int -> Prop -> World -> World
setRemoteScope itid pj w' = case w' ^? itemPositions . ix itid of
    Just (InInv cid' invid )
        -> w' & creatures . ix cid' . crInv . ix invid . itScope
                . scopePos .~ (_prPos pj -.- _crPos (_creatures w' IM.! cid'))
    _   -> w'
