module Dodge.Inventory.Add where
import Dodge.Data
import Dodge.Inventory.CheckSlots
import Dodge.FloorItem
import Dodge.Combine.Module
import Dodge.Base.You

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

putItemInInvID :: Int -> Int -> World -> (Maybe Int,World)
putItemInInvID cid flid w = fromMaybe (Nothing,w) $ do
    (i,w') <- tryPutItemInInv cid (_floorItems w IM.! flid) w
    return (Just i,w')

putItemInInvSlot :: Int -> Item -> IM.IntMap Item -> IM.IntMap Item
putItemInInvSlot = IM.insertWith (const $ itConsumption . icAmount +~ 1)

{- | Pick up a specific item. -}
tryPutItemInInv :: Int -> FloorItem -> World -> Maybe (Int,World)
tryPutItemInInv cid flit w = case maybeInvSlot of
    Nothing -> Nothing
    Just i  -> Just (i, w
        & updateItLocation i
        & floorItems %~ IM.delete (_flItID flit)
        & creatures . ix cid . crInv %~ putItemInInvSlot i it
        )
  where 
    it = _flIt flit
    maybeInvSlot = checkInvSlotsYou it w
    updateItLocation invid w' = case _itID it of 
        Nothing -> w'
        Just j  -> w' & itemPositions . ix j .~ InInv cid invid

--{- | Pick up a specific item. -}
--putItemInInv :: Int -> FloorItem -> World -> World
--putItemInInv cid flit w = case maybeInvSlot of
--    Nothing -> w
--    Just i  -> w
--        & updateItLocation i
--        & floorItems %~ IM.delete (_flItID flit)
--        & creatures . ix cid . crInv %~ IM.insertWith (const $ itAmount +~ 1) i it
--  where 
--    it = _flIt flit
--    maybeInvSlot = checkInvSlotsYou it w
--    updateItLocation invid w' = case _itID it of 
--        Nothing -> w'
--        Just j  -> w' & itemPositions . ix j .~ InInv cid invid
createPutItem :: Item -> World -> (Maybe Int, World)
createPutItem it w = uncurry (putItemInInvID (_yourID w))
    $ copyItemToFloorID (_crPos $ you w) (applyModules it) w
