{-# LANGUAGE TemplateHaskell #-}
{-# OPTIONS_HADDOCK hide #-}
{-# LANGUAGE BangPatterns #-}
module Graphics.WorldTurtle.Internal.Turtle
  ( TurtleData
  , defaultTurtle
  , drawTurtle
  , heading
  , position
  , representation
  , penDown
  , speed
  , rotationSpeed
  , Graphics.WorldTurtle.Internal.Turtle.scale
  , penColor
  , penSize
  , visible
  ) where

import Control.Lens

import Graphics.WorldTurtle.Shapes

import Graphics.Gloss.Data.Color
import Graphics.Gloss.Data.Picture
import qualified Graphics.Gloss.Data.Picture as G (scale)

import qualified Graphics.WorldTurtle.Internal.Coords as P

data TurtleData = TurtleData
    { TurtleData -> Float
_heading :: !Float
    , TurtleData -> Point
_position :: !P.Point 
    , TurtleData -> Picture
_representation :: !Picture
    , TurtleData -> Bool
_penDown :: !Bool
    , TurtleData -> Float
_speed :: !Float
    , TurtleData -> Float
_rotationSpeed :: Float
    , TurtleData -> Float
_scale :: !Float
    , TurtleData -> Color
_penColor :: !Color
    , TurtleData -> Float
_penSize :: !Float
    , TurtleData -> Bool
_visible :: !Bool
    }

$(makeLenses ''TurtleData)

defaultTurtle :: TurtleData
defaultTurtle :: TurtleData
defaultTurtle = TurtleData :: Float
-> Point
-> Picture
-> Bool
-> Float
-> Float
-> Float
-> Color
-> Float
-> Bool
-> TurtleData
TurtleData
    { _heading :: Float
_heading = Float
90
    , _position :: Point
_position = (Float
0, Float
0)
    , _representation :: Picture
_representation = Color -> Color -> Picture
turtleArrow Color
black Color
blue
    , _penDown :: Bool
_penDown = Bool
True
    , _speed :: Float
_speed = Float
200
    , _rotationSpeed :: Float
_rotationSpeed = Float
720
    , _scale :: Float
_scale = Float
1
    , _penColor :: Color
_penColor = Color
black
    , _penSize :: Float
_penSize = Float
2
    , _visible :: Bool
_visible = Bool
True
    }

drawTurtle :: TurtleData -> Picture
drawTurtle :: TurtleData -> Picture
drawTurtle TurtleData
t
  | Bool -> Bool
not (TurtleData
t TurtleData -> Getting Bool TurtleData Bool -> Bool
forall s a. s -> Getting a s a -> a
^. Getting Bool TurtleData Bool
Lens' TurtleData Bool
visible)     = Picture
blank
  | Bool
otherwise = let (Float
x, Float
y) = TurtleData -> Point
_position TurtleData
t
                    s :: Float
s = TurtleData -> Float
_scale TurtleData
t
                 in Float -> Float -> Picture -> Picture
translate Float
x Float
y 
                  (Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Picture -> Picture
rotate (Float
360 Float -> Float -> Float
forall a. Num a => a -> a -> a
- TurtleData
t TurtleData -> Getting Float TurtleData Float -> Float
forall s a. s -> Getting a s a -> a
^. Getting Float TurtleData Float
Lens' TurtleData Float
heading) -- Anticlockwise to clockwise.

                  (Picture -> Picture) -> Picture -> Picture
forall a b. (a -> b) -> a -> b
$ Float -> Float -> Picture -> Picture
G.scale Float
s Float
s
                    (TurtleData
t TurtleData -> Getting Picture TurtleData Picture -> Picture
forall s a. s -> Getting a s a -> a
^. Getting Picture TurtleData Picture
Lens' TurtleData Picture
representation)