module Lseed.StipeInfo where

import Lseed.Data
import Lseed.Constants
import Lseed.Data.Functions
import Lseed.Geometry

annotateGarden :: Angle -> GrowingGarden -> AnnotatedGarden
annotateGarden angle  = map (mapPlanted annotatePlant) . lightenGarden angle

annotatePlant :: Plant (GrowthState, Double) -> AnnotatedPlant
annotatePlant = go 0 0 0
  where go d o h (Plant (gs, light) len ang ut ps) = Plant (StipeInfo
		{ siLength    = len
		, siSubLength = len + sum (map (siSubLength . pData) ps')
		, siLight     = light
		, siSubLight  = light + sum (map (siSubLight . pData) ps')
		, siAngle     = ang
		, siDirection = normAngle d'
		, siGrowth    = gs
		, siOffset    = o'
		, siHeight    = h'
		}) len ang ut ps'
	  where ps' = map (go d' o' h') ps
	  	d' = (d+ang)
		o' = o - len * stipeLength * sin d'
		h' = h + len * stipeLength * cos d'

normAngle a = a - fromIntegral (truncate ((a+pi) / (2*pi))) * 2*pi