{-|
Module: BattlePlace.Skill.Glicko.Types
Description: Types for Glicko ratings.
License: MIT
-}

{-# LANGUAGE DeriveGeneric #-}

module BattlePlace.Skill.Glicko.Types
	( Skill(..)
	, ratingFromSkill
	) where

import qualified Data.Aeson as J
import Data.Default
import GHC.Generics(Generic)

import BattlePlace.Rating
import BattlePlace.Util

data Skill = Skill
	{ skill_rating :: {-# UNPACK #-} !Double
	, skill_deviation :: {-# UNPACK #-} !Double
	, skill_volatility :: {-# UNPACK #-} !Double
	} deriving Generic

-- default skill
instance Default (Skill) where
	def = Skill
		{ skill_rating = 1500
		, skill_deviation = 350
		, skill_volatility = 0.06
		}

instance J.FromJSON (Skill) where
	parseJSON = J.genericParseJSON jsonOptions
instance J.ToJSON (Skill) where
	toJSON = J.genericToJSON jsonOptions
	toEncoding = J.genericToEncoding jsonOptions

-- | Conservative rating for skill.
ratingFromSkill :: Skill -> Rating
ratingFromSkill Skill
	{ skill_rating = rating
	, skill_deviation = deviation
	} = Rating $ rating - deviation * 2