{-# LANGUAGE StrictData #-}

module Octane.Type.Value
  ( Value(..)
  , module Octane.Type.Value.BooleanValue
  , module Octane.Type.Value.ByteValue
  , module Octane.Type.Value.CamSettingsValue
  , module Octane.Type.Value.ClubColorsValue
  , module Octane.Type.Value.DemolishValue
  , module Octane.Type.Value.EnumValue
  , module Octane.Type.Value.ExplosionValue
  , module Octane.Type.Value.FlaggedIntValue
  , module Octane.Type.Value.FloatValue
  , module Octane.Type.Value.GameModeValue
  , module Octane.Type.Value.IntValue
  , module Octane.Type.Value.LoadoutOnlineValue
  , module Octane.Type.Value.LoadoutsOnlineValue
  , module Octane.Type.Value.LoadoutsValue
  , module Octane.Type.Value.LoadoutValue
  , module Octane.Type.Value.LocationValue
  , module Octane.Type.Value.MusicStingerValue
  , module Octane.Type.Value.PickupValue
  , module Octane.Type.Value.PrivateMatchSettingsValue
  , module Octane.Type.Value.QWordValue
  , module Octane.Type.Value.ReservationValue
  , module Octane.Type.Value.RigidBodyStateValue
  , module Octane.Type.Value.StringValue
  , module Octane.Type.Value.TeamPaintValue
  , module Octane.Type.Value.UniqueIdValue
  , module Octane.Type.Value.WeldedInfoValue
  ) where

import Octane.Type.Value.BooleanValue
import Octane.Type.Value.ByteValue
import Octane.Type.Value.CamSettingsValue
import Octane.Type.Value.ClubColorsValue
import Octane.Type.Value.DemolishValue
import Octane.Type.Value.EnumValue
import Octane.Type.Value.ExplosionValue
import Octane.Type.Value.FlaggedIntValue
import Octane.Type.Value.FloatValue
import Octane.Type.Value.GameModeValue
import Octane.Type.Value.IntValue
import Octane.Type.Value.LoadoutOnlineValue
import Octane.Type.Value.LoadoutValue
import Octane.Type.Value.LoadoutsOnlineValue
import Octane.Type.Value.LoadoutsValue
import Octane.Type.Value.LocationValue
import Octane.Type.Value.MusicStingerValue
import Octane.Type.Value.PickupValue
import Octane.Type.Value.PrivateMatchSettingsValue
import Octane.Type.Value.QWordValue
import Octane.Type.Value.ReservationValue
import Octane.Type.Value.RigidBodyStateValue
import Octane.Type.Value.StringValue
import Octane.Type.Value.TeamPaintValue
import Octane.Type.Value.UniqueIdValue
import Octane.Type.Value.WeldedInfoValue

import qualified Data.Aeson as Aeson

-- | A replicated property's value.
data Value
  = ValueBoolean BooleanValue
  | ValueByte ByteValue
  | ValueCamSettings CamSettingsValue
  | ValueClubColors ClubColorsValue
  | ValueDemolish DemolishValue
  | ValueEnum EnumValue
  | ValueExplosion ExplosionValue
  | ValueFlaggedInt FlaggedIntValue
  | ValueFloat FloatValue
  | ValueGameMode GameModeValue
  | ValueInt IntValue
  | ValueLoadout LoadoutValue
  | ValueLoadoutOnline LoadoutOnlineValue
  | ValueLoadouts LoadoutsValue
  | ValueLoadoutsOnline LoadoutsOnlineValue
  | ValueLocation LocationValue
  | ValueMusicStinger MusicStingerValue
  | ValuePickup PickupValue
  | ValuePrivateMatchSettings PrivateMatchSettingsValue
  | ValueQWord QWordValue
  | ValueReservation ReservationValue
  | ValueRigidBodyState RigidBodyStateValue
  | ValueString StringValue
  | ValueTeamPaint TeamPaintValue
  | ValueUniqueId UniqueIdValue
  | ValueWeldedInfo WeldedInfoValue
  deriving (Eq, Show)

instance Aeson.ToJSON Value where
  toJSON value =
    case value of
      ValueBoolean x -> Aeson.toJSON x
      ValueByte x -> Aeson.toJSON x
      ValueCamSettings x -> Aeson.toJSON x
      ValueClubColors x -> Aeson.toJSON x
      ValueDemolish x -> Aeson.toJSON x
      ValueEnum x -> Aeson.toJSON x
      ValueExplosion x -> Aeson.toJSON x
      ValueFlaggedInt x -> Aeson.toJSON x
      ValueFloat x -> Aeson.toJSON x
      ValueGameMode x -> Aeson.toJSON x
      ValueInt x -> Aeson.toJSON x
      ValueLoadout x -> Aeson.toJSON x
      ValueLoadoutOnline x -> Aeson.toJSON x
      ValueLoadouts x -> Aeson.toJSON x
      ValueLoadoutsOnline x -> Aeson.toJSON x
      ValueLocation x -> Aeson.toJSON x
      ValueMusicStinger x -> Aeson.toJSON x
      ValuePickup x -> Aeson.toJSON x
      ValuePrivateMatchSettings x -> Aeson.toJSON x
      ValueQWord x -> Aeson.toJSON x
      ValueReservation x -> Aeson.toJSON x
      ValueRigidBodyState x -> Aeson.toJSON x
      ValueString x -> Aeson.toJSON x
      ValueTeamPaint x -> Aeson.toJSON x
      ValueUniqueId x -> Aeson.toJSON x
      ValueWeldedInfo x -> Aeson.toJSON x