module Dodge.Creature.SentinelAI
    ( sentinelAI
    , sentinelFireType
    , sentinelExtraWatchUpdate
    ) where
import Dodge.Data
import Dodge.Creature.ChainUpdates
import Dodge.Base.Collide
import Dodge.Creature.Test
import Dodge.Creature.Volition
import Dodge.Creature.ReaderUpdate
import Dodge.Creature.Strategy
import Dodge.Creature.Action
import Dodge.Creature.Perception
import Geometry.Data

import Data.Maybe
import Control.Lens

sentinelAI :: World -> Creature -> Creature
sentinelAI w = reloadOverride .
    sentinelExtraWatchUpdate
    [ (crHasTargetLOS
      , \ _ cr -> StrategyActions (ShootAt (fromJust $ tcid cr)) 
        [ DoActionIf 
                (const $ not . crIsAiming) 
                (drawWeapon `DoActionThen` (50 `WaitThen` NoAction))
            `DoActionThen` lostest
            `DoActionWhile` advanceShoot 
            `DoActionThen` 75 
            `DoReplicate` advanceShoot 
            `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
        , AimAt { _targetID = fromJust $ tcid cr , _targetSeenAt = V2 0 0 }
        ]
      )
    ] 
    w
  where
    advanceShoot = DoImpulses [UseItem, MoveForward 3]
    tcid cr = _crID <$> _targetCr (_crIntention cr)
    lostest w' cr = maybe False (\cid -> canSee (_crID cr) cid w') (tcid cr)

--chainCreatureUpdates :: [World -> Creature -> Creature] -> World -> Creature -> Creature
--chainCreatureUpdates ls w cr = foldr (\f -> f w) cr ls


sentinelFireType :: (Int -> Action) -> World -> Creature -> Creature
sentinelFireType f = chainCreatureUpdates
    [ performActions
    , watchUpdateStrat
      [ (crHasTargetLOS, \_ _ -> StrategyActions (ShootAt 0) 
            [ drawwp `DoActionThen` f 0 `DoActionThen` DoImpulses [ChangeStrategy WatchAndWait]
            , aiming
            ]
        )
      , (const crAwayFromPost, const goToPostStrat)
      ] 
    , perceptionUpdate [0]
--    , Left $ perceptionUp 0
    , const doStrategyActions
    , const reloadOverride
    , targetYouWhenCognizant
    , const $ overrideInternal
        (\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
        (crActionPlan . apStrategy .~ WatchAndWait)
    ]
  where
    drawwp = DoActionIfElse NoAction (const crIsAiming) (DoActionThen drawWeapon (WaitThen 50 NoAction))
    aiming = AimAt
        { _targetID = 0
        , _targetSeenAt = V2 0 0 -- hack
        }

sentinelExtraWatchUpdate
    :: [(World -> Creature -> Bool , World -> Creature -> Strategy)]
    -> World
    -> Creature
    -> Creature
sentinelExtraWatchUpdate xs = chainCreatureUpdates
    [ performActions
    , watchUpdateStrat
        ( xs ++ [(const crAwayFromPost, const goToPostStrat)] )
    , perceptionUpdate [0]
    , const doStrategyActions
    , targetYouWhenCognizant
    , const $ overrideInternal
        (\cr -> crHasTarget cr && crStratConMatches (GetTo (V2 0 0)) cr)
        (crActionPlan . apStrategy .~ WatchAndWait)
    ]

--shootAtAdvance :: Int -> [Action]
--shootAtAdvance tcid =
--    [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
--      `DoActionThen`
--        lostest `DoActionWhile`
--        advanceShoot `DoActionThen`
--        75 `DoReplicate` 
--        advanceShoot `DoActionThen`
--        DoImpulses [ChangeStrategy WatchAndWait]
--    , AimAt
--        { _targetID = tcid
--        , _targetSeenAt = V2 0 0 -- hack
--        }
--    ]
--  where
--    lostest (w,cr') = canSee (_crID cr') tcid w 
--    advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
--
--shootAtWhileContinueTime :: Int -> World -> Creature -> Strategy
--shootAtWhileContinueTime tcid _ _ = StrategyActions (ShootAt tcid)
--    [ DoActionIfElse NoAction crIsAiming (DoActionThen drawWeapon (WaitThen 50 NoAction))
--      `DoActionThen`
--        lostest `DoActionWhile`
--        advanceShoot `DoActionThen`
--        75 `DoReplicate` 
--        advanceShoot `DoActionThen`
--        DoImpulses [ChangeStrategy WatchAndWait]
--    , AimAt
--        { _targetID = tcid
--        , _targetSeenAt = V2 0 0 -- hack
--        }
--    ]
--  where
--    lostest (w,cr') = canSee (_crID cr') tcid w 
--    advanceShoot = ImpulsesList [[UseItem, MoveForward 3]]
