{-|
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