{-# LANGUAGE TemplateHaskell #-}

module Octane.Data where

import qualified Data.Bimap as Bimap
import qualified Data.FileEmbed as FileEmbed
import qualified Data.Map.Strict as Map
import qualified Data.Set as Set
import qualified Data.Text as StrictText
import qualified Octane.Utility.Embed as Embed

-- $setup
-- >>> :set -XOverloadedStrings


-- | A map from object names to their class names.
--
-- >>> Map.lookup "Archetypes.Ball.Ball_Default" classes
-- Just "TAGame.Ball_TA"
--
-- Note that some object names have been normalized to make lookup easier.
--
-- >>> Map.lookup "Neotokyo_p.TheWorld:PersistentLevel.InMapScoreboard_TA_0@" classes
-- Nothing
-- >>> Map.lookup "TheWorld:PersistentLevel.InMapScoreboard_TA" classes
-- Just "TAGame.InMapScoreboard_TA"
classes :: Map.Map StrictText.Text StrictText.Text
classes = Embed.decodeMap $(FileEmbed.embedFile "data/classes.json")


-- | A set of classes that have an initial location vector.
--
-- >>> Set.member "TAGame.Ball_TA" classesWithLocation
-- True
classesWithLocation :: Set.Set StrictText.Text
classesWithLocation = Embed.decodeSet $(FileEmbed.embedFile "data/classes-with-location.json")


-- | A set of classes that have an initial rotation vector.
--
-- >>> Set.member "TAGame.Ball_TA" classesWithRotation
-- True
classesWithRotation :: Set.Set StrictText.Text
classesWithRotation = Embed.decodeSet $(FileEmbed.embedFile "data/classes-with-rotation.json")


-- | A one-to-one mapping between game mode IDs and their names.
--
-- >>> Bimap.lookup 1 gameModes :: Maybe StrictText.Text
-- Just "Hockey"
gameModes :: Bimap.Bimap Int StrictText.Text
gameModes = Embed.decodeBimap $(FileEmbed.embedFile "data/game-modes.json")


-- | A one-to-one mapping between product IDs and their names.
--
-- >>> Bimap.lookup 1 products :: Maybe StrictText.Text
-- Just "Antenna_8Ball"
products :: Bimap.Bimap Word StrictText.Text
products = Embed.decodeBimap $(FileEmbed.embedFile "data/products.json")


-- | A mapping between property names and their serialized type.
--
-- >>> Map.lookup "Engine.Actor:bBlockActors" properties
-- Just "boolean"
properties :: Map.Map StrictText.Text StrictText.Text
properties = Embed.decodeMap $(FileEmbed.embedFile "data/properties.json")