module FPPrac.Graphics.MakePrimitives where

import EventLoop.Output
import EventLoop.CommonTypes
import FPPrac.Graphics.NormalizeNumber

type NormalizedNum = Float
type TextSize = NormalizedNum
type Radius = NormalizedNum
type Angle  = NormalizedNum

createDrawCommand :: GObject -> String -> Graphical
createDrawCommand g groupname = Draw g groupname

createMoveGroupCommand :: String -> Pos -> Relative -> Graphical
createMoveGroupCommand groupname pos rel = MoveGroup groupname pos rel

createMoveElementCommand :: String -> Pos -> Relative -> Graphical
createMoveElementCommand name pos rel = MoveElement name pos rel

createRemoveGroupCommand :: String -> Graphical
createRemoveGroupCommand groupname = RemoveGroup groupname

createRemoveElementCommand :: String -> Graphical
createRemoveElementCommand name = RemoveElement name


createGraphicalObject :: String -> Primitive -> [GObject] -> GObject
createGraphicalObject name prim children = GObject name prim children

createGraphicalContainer :: [GObject] -> GObject
createGraphicalContainer contents = Container contents


createTextPrimitive :: Color -> Pos -> TextSize -> Font -> String -> Bool -> Primitive
createTextPrimitive col pos size font str fromCenter = Text (0,0,0) 1 col pos size font str fromCenter

createLinePrimitive :: Color -> [Pos] -> Primitive
createLinePrimitive col positions = Line col 1 positions

createRectPrimitive :: Color -> Pos -> Dimension -> Primitive
createRectPrimitive col pos dim = Rect (0,0,0) 0 col pos dim

createArcPrimitive :: Color -> Pos -> Radius -> Angle -> Angle -> Primitive
createArcPrimitive col pos rad startAngle endAngle = Arc (0,0,0) 0 col pos rad startAngle endAngle

-- (x,y)
createPosition :: (NormalizeNumber x, NormalizeNumber y) => x -> y -> (NormalizedNum ,NormalizedNum)
createPosition x y = (normalize x, normalize y)

-- (w,h)
createDimension :: (NormalizeNumber w, NormalizeNumber h) => w -> h -> (NormalizedNum, NormalizedNum)
createDimension w h = (normalize w, normalize h)

createColor :: (NormalizeNumber r, NormalizeNumber g, NormalizeNumber b) => r -> g -> b -> (NormalizedNum, NormalizedNum, NormalizedNum)
createColor r g b = (normalize r, normalize g, normalize b)

createNormalizedNum :: (NormalizeNumber i) => i -> NormalizedNum
createNormalizedNum i = normalize i