{-# LANGUAGE OverloadedStrings #-}
-- | Rhythm descriptors.
module AcousticBrainz.LowLevel.Rhythm where

import           AcousticBrainz.StatisticalUnits
import qualified AcousticBrainz.LowLevel.Algorithm.BpmHistogramDescriptors as BpmHistogramDescriptors

import           Data.Aeson
import           Data.Aeson.Types
import           Data.Scientific

data Rhythm = Rhythm
  { _beatsCount              :: Int
  , _beatsLoudness           :: StatisticalUnits
  , _beatsLoudnessBandRatio  :: [StatisticalUnits]
  , _beatsPosition           :: [Scientific]
  , _beatsPerMinute          :: Scientific
  , _beatsPerMinuteHistogram :: BpmHistogramDescriptors.Output
  , _danceability            :: Scientific
  , _onsetRate               :: Scientific
  } deriving(Eq, Read, Show)

instance FromJSON Rhythm where
  parseJSON value = flip (withObject "rhythm") value $ \v -> Rhythm
    <$> v .: "beats_count"
    <*> v .: "beats_loudness"
    <*> (_statisticalUnitsList <$> v .: "beats_loudness_band_ratio")
    <*> v .: "beats_position"
    <*> v .: "bpm"
    <*> parseJSON value
    <*> v .: "danceability"
    <*> v .: "onset_rate"