module Affection.MessageBus.Message.WindowMessage where

import Affection.MessageBus.Message.Class

import Data.Int (Int32(..))

import qualified SDL

import Linear (V2(..))

data WindowMessage
  -- = MsgEngineReady Double
  = MsgWindowShow
    { msgWSWhen :: Double
    , msgWSWindow :: SDL.Window
    }
  | MsgWindowHide
    { msgWHWhen :: Double
    , msgWHWindow :: SDL.Window
    }
  | MsgWindowExpose
    { msgWEWhen :: Double
    , msgWEWindow :: SDL.Window
    }
  | MsgWindowMove
    { msgWMWhen :: Double
    , msgWMWindow :: SDL.Window
    , msgWMNewPos :: V2 Int32
    }
  | MsgWindowResize
    { msgWRWhen :: Double
    , msgWRWindow :: SDL.Window
    , msgWRNewSize :: V2 Int32
    }
  | MsgWindowSizeChange
    { msgWSCWhen :: Double
    , msgWSCWindow :: SDL.Window
    }
  | MsgWindowMinimize
    { msgWMinWhen :: Double
    , msgWMinWindow :: SDL.Window
    }
  | MsgWindowMaximize
    { msgWMaxWhen :: Double
    , msgWMaxWindow :: SDL.Window
    }
  | MsgWindowRestore
    { msgWRestWhen :: Double
    , msgWRestWindow :: SDL.Window
    }
  | MsgWindowGainMouseFocus
    { msgWGMFWhen :: Double
    , msgWGMFWindow :: SDL.Window
    }
  | MsgWindowLoseMouseFocus
    { msgWLMFWhen :: Double
    , msgWLMFWindow :: SDL.Window
    }
  | MsgWindowGainKeyboardFocus
    { msgWGKFWhen :: Double
    , msgWGKFWindow :: SDL.Window
    }
  | MsgWindowLoseKeyboardFocus
    { msgWLKFWhen :: Double
    , msgWLKFWindow :: SDL.Window
    }
  | MsgWindowClose
    { msgWCWhen :: Double
    , msgWCWindow :: SDL.Window
    }
  | MsgWindowEmptyEvent
  deriving (Show)

instance Message WindowMessage where
  -- msgTime (MsgEngineReady t)   = t
  msgTime (MsgWindowShow t _) = t
  msgTime (MsgWindowHide t _) = t
  msgTime (MsgWindowExpose t _) = t
  msgTime (MsgWindowMove t _ _) = t
  msgTime (MsgWindowResize t _ _) = t
  msgTime (MsgWindowSizeChange t _) = t
  msgTime (MsgWindowMinimize t _) = t
  msgTime (MsgWindowMaximize t _) = t
  msgTime (MsgWindowRestore t _) = t
  msgTime (MsgWindowGainMouseFocus t _) = t
  msgTime (MsgWindowLoseMouseFocus t _) = t
  msgTime (MsgWindowGainKeyboardFocus t _) = t
  msgTime (MsgWindowLoseKeyboardFocus t _) = t
  msgTime (MsgWindowClose t _) = t