module View.Controlled exposing (get_html)
-- Elm -------------------------------------------------------------------------
import Html
import Html.Attributes
import Html.Events
-- Shared ----------------------------------------------------------------------
import Util.Html
-- Local Module ----------------------------------------------------------------
import Struct.CharacterTurn
import Struct.Event
import Struct.Navigator
import View.Controlled.CharacterCard
import View.Controlled.ManualControls
--------------------------------------------------------------------------------
-- LOCAL -----------------------------------------------------------------------
--------------------------------------------------------------------------------
has_a_path : Struct.CharacterTurn.Type -> Bool
has_a_path char_turn =
   case (Struct.CharacterTurn.try_getting_navigator char_turn) of
      (Just nav) -> ((Struct.Navigator.get_path nav) /= [])
      Nothing -> False
attack_button : Struct.CharacterTurn.Type -> (Html.Html Struct.Event.Type)
attack_button char_turn =
   (Html.button
      [ (Html.Events.onClick Struct.Event.AttackWithoutMovingRequest) ]
      [
         (Html.text
            (
               if (has_a_path char_turn)
               then ("Go & Select Target")
               else ("Select Target")
            )
         )
      ]
   )
abort_button : (Html.Html Struct.Event.Type)
abort_button =
   (Html.button
      [ (Html.Events.onClick Struct.Event.AbortTurnRequest) ]
      [ (Html.text "Abort") ]
   )
undo_button : (Html.Html Struct.Event.Type)
undo_button =
   (Html.button
      [ (Html.Events.onClick Struct.Event.UndoActionRequest) ]
      [ (Html.text "Undo") ]
   )
end_turn_button : String -> (Html.Html Struct.Event.Type)
end_turn_button suffix =
   (Html.button
      [
         (Html.Events.onClick Struct.Event.TurnEnded),
         (Html.Attributes.class "end-turn-button")
      ]
      [ (Html.text ("End Turn" ++ suffix)) ]
   )
inventory_button : Bool -> (Html.Html Struct.Event.Type)
inventory_button go_prefix =
   (Html.button
      [ (Html.Events.onClick Struct.Event.WeaponSwitchRequest) ]
      [
         (Html.text
            (
               if (go_prefix)
               then ("Go & Switch Weapon")
               else ("Switch Weapon")
            )
         )
      ]
   )
get_available_actions : (
      Struct.CharacterTurn.Type ->
      (List (Html.Html Struct.Event.Type))
   )
get_available_actions char_turn =
   case (Struct.CharacterTurn.get_state char_turn) of
      Struct.CharacterTurn.SelectedCharacter ->
         [
            (attack_button char_turn),
            (inventory_button (has_a_path char_turn)),
            (end_turn_button " Doing Nothing"),
            (abort_button)
         ]
      Struct.CharacterTurn.MovedCharacter ->
         [
            (inventory_button False),
            (end_turn_button " by Moving"),
            (undo_button),
            (abort_button)
         ]
      Struct.CharacterTurn.ChoseTarget ->
         [
            (end_turn_button " by Attacking"),
            (undo_button),
            (abort_button)
         ]
      Struct.CharacterTurn.SwitchedWeapons ->
         [
            (end_turn_button " by Switching Weapons"),
            (undo_button),
            (abort_button)
         ]
      _ ->
         [
         ]
--------------------------------------------------------------------------------
-- EXPORTED --------------------------------------------------------------------
--------------------------------------------------------------------------------
get_html : Struct.CharacterTurn.Type -> Int -> (Html.Html Struct.Event.Type)
get_html char_turn player_ix =
   case
      (Struct.CharacterTurn.try_getting_active_character char_turn)
   of
      (Just char) ->
         (Html.div
            [(Html.Attributes.class "controlled")]
            [
               (View.Controlled.CharacterCard.get_summary_html
                  char_turn
                  player_ix
                  char
               ),
               (
                  if
                  (
                     (Struct.CharacterTurn.get_state char_turn)
                     ==
                     Struct.CharacterTurn.SelectedCharacter
                  )
                  then
                     (View.Controlled.ManualControls.get_html)
                  else
                     (Util.Html.nothing)
               ),
               (Html.div
                  [(Html.Attributes.class "controlled-actions")]
                  (get_available_actions char_turn)
               )
            ]
         )
      Nothing -> (Util.Html.nothing)