import Graphics.Rendering.OpenGL
import Graphics.UI.GLUT  as GLUT

import Data.IORef

import OrbitPointOfView
import StateUtil
import RubikLogic
import RenderRubik

main = do 
  initialDisplayMode $= [DoubleBuffered,RGBMode,WithDepthBuffer]
  (progName,_) <-  getArgsAndInitialize

  createWindow progName

  depthFunc $= Just Less

  pPos  <- new (90::Int,270::Int,2.0)
  pCube <- new initCube

  displayCallback $= display pPos pCube
  keyboardMouseCallback $= Just (keyboard pPos pCube)

  reshapeCallback $= Just reshape
  mainLoop

display pPos pCube = do
  clearColor $= Color4 1 1 1 1
  clear [ColorBuffer,DepthBuffer]
  loadIdentity
  setPointOfView pPos
  cube <- get pCube 
  renderCube$fmap doColor  cube
  swapBuffers

keyboard _ pCube (Char '1') Down _ _
  = rot pCube RubikLogic.Top 
keyboard _ pCube (Char '2') Down _ _ 
 = rot pCube RubikLogic.Bottom 
keyboard _ pCube (Char '3') Down _ _ 
 = rot pCube RubikLogic.Front
keyboard _ pCube (Char '4') Down _ _
  = rot pCube RubikLogic.Back
keyboard _ pCube (Char '5') Down _ _
  = rot pCube RubikLogic.Left
keyboard _ pCube (Char '6') Down _ _ 
 = rot pCube RubikLogic.Right
keyboard pPos _   c         _    _ _
  = keyForPos pPos c 

rot pCube p = do
  cube <- get pCube
  pCube $= rotateArea p cube
  postRedisplay Nothing
