module Octane.Data.Properties
    ( booleanProperties
    , byteProperties
    , camSettingsProperties
    , demolishProperties
    , enumProperties
    , explosionProperties
    , flaggedIntProperties
    , floatProperties
    , gameModeProperties
    , intProperties
    , loadoutOnlineProperties
    , loadoutProperties
    , locationProperties
    , musicStingerProperties
    , pickupProperties
    , privateMatchSettingsProperties
    , qWordProperties
    , relativeRotationProperties
    , reservationProperties
    , rigidBodyStateProperties
    , stringProperties
    , teamPaintProperties
    , uniqueIdProperties
    ) where

import Data.Function ((&))

import qualified Data.Set as Set
import qualified Data.Text as StrictText


-- | A set of properties that are booleans.
booleanProperties :: Set.Set StrictText.Text
booleanProperties =
    [ "Engine.Actor:bBlockActors"
    , "Engine.Actor:bCollideActors"
    , "Engine.Actor:bCollideWorld"
    , "Engine.Actor:bHardAttach"
    , "Engine.Actor:bHidden"
    , "Engine.Actor:bNetOwner"
    , "Engine.Actor:bProjTarget"
    , "Engine.Actor:bTearOff"
    , "Engine.GameReplicationInfo:bMatchIsOver"
    , "Engine.Pawn:bCanSwatTurn"
    , "Engine.Pawn:bRootMotionFromInterpCurve"
    , "Engine.Pawn:bSimulateGravity"
    , "Engine.PlayerReplicationInfo:bAdmin"
    , "Engine.PlayerReplicationInfo:bBot"
    , "Engine.PlayerReplicationInfo:bFromPreviousLevel"
    , "Engine.PlayerReplicationInfo:bIsSpectator"
    , "Engine.PlayerReplicationInfo:bOnlySpectator"
    , "Engine.PlayerReplicationInfo:bOutOfLives"
    , "Engine.PlayerReplicationInfo:bReadyToPlay"
    , "Engine.PlayerReplicationInfo:bWaitingPlayer"
    , "ProjectX.GRI_X:bGameStarted"
    , "TAGame.CameraSettingsActor_TA:bUsingBehindView"
    , "TAGame.CameraSettingsActor_TA:bUsingSecondaryCamera"
    , "TAGame.CarComponent_Boost_TA:bNoBoost"
    , "TAGame.CarComponent_Boost_TA:bUnlimitedBoost"
    , "TAGame.CarComponent_FlipCar_TA:bFlipRight"
    , "TAGame.GameEvent_Soccar_TA:bBallHasBeenHit"
    , "TAGame.GameEvent_Soccar_TA:bOverTime"
    , "TAGame.GameEvent_TA:bHasLeaveMatchPenalty"
    , "TAGame.GameEvent_Team_TA:bDisableMutingOtherTeam"
    , "TAGame.PRI_TA:bIsInSplitScreen"
    , "TAGame.PRI_TA:bMatchMVP"
    , "TAGame.PRI_TA:bOnlineLoadoutSet"
    , "TAGame.PRI_TA:bReady"
    , "TAGame.PRI_TA:bUsingBehindView"
    , "TAGame.PRI_TA:bUsingFreecam"
    , "TAGame.PRI_TA:bUsingSecondaryCamera"
    , "TAGame.PRI_TA:bVoteToForfeitDisabled"
    , "TAGame.RBActor_TA:bFrozen"
    , "TAGame.RBActor_TA:bReplayActor"
    , "TAGame.Vehicle_TA:bDriving"
    , "TAGame.Vehicle_TA:bReplicatedHandbrake"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are bytes.
byteProperties :: Set.Set StrictText.Text
byteProperties =
    [ "Engine.PlayerReplicationInfo:Ping"
    , "TAGame.Ball_TA:HitTeamNum"
    , "TAGame.CameraSettingsActor_TA:CameraPitch"
    , "TAGame.CameraSettingsActor_TA:CameraYaw"
    , "TAGame.CarComponent_Boost_TA:ReplicatedBoostAmount"
    , "TAGame.CarComponent_TA:ReplicatedActive"
    , "TAGame.GameEvent_Soccar_TA:ReplicatedScoredOnTeam"
    , "TAGame.GameEvent_TA:ReplicatedStateIndex"
    , "TAGame.PRI_TA:CameraPitch"
    , "TAGame.PRI_TA:CameraYaw"
    , "TAGame.Vehicle_TA:ReplicatedSteer"
    , "TAGame.Vehicle_TA:ReplicatedThrottle"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are camera settings.
camSettingsProperties :: Set.Set StrictText.Text
camSettingsProperties =
    [ "TAGame.CameraSettingsActor_TA:ProfileSettings"
    , "TAGame.PRI_TA:CameraSettings"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are demolitions.
demolishProperties :: Set.Set StrictText.Text
demolishProperties =
    [ "TAGame.Car_TA:ReplicatedDemolish"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are enumerations.
enumProperties :: Set.Set StrictText.Text
enumProperties =
    [ "Engine.Actor:Role"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are explosions.
explosionProperties :: Set.Set StrictText.Text
explosionProperties =
    [ "TAGame.Ball_TA:ReplicatedExplosionData"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are flagged integers.
flaggedIntProperties :: Set.Set StrictText.Text
flaggedIntProperties =
    [ "Engine.Actor:Owner"
    , "Engine.Actor:ReplicatedCollisionType"
    , "Engine.GameReplicationInfo:GameClass"
    , "Engine.Pawn:PlayerReplicationInfo"
    , "Engine.PlayerReplicationInfo:Team"
    , "Engine.TeamInfo:TeamIndex"
    , "TAGame.Ball_TA:GameEvent"
    , "TAGame.CameraSettingsActor_TA:PRI"
    , "TAGame.CarComponent_TA:Vehicle"
    , "TAGame.CrowdActor_TA:GameEvent"
    , "TAGame.CrowdActor_TA:ReplicatedOneShotSound"
    , "TAGame.CrowdManager_TA:GameEvent"
    , "TAGame.CrowdManager_TA:ReplicatedGlobalOneShotSound"
    , "TAGame.PRI_TA:PersistentCamera"
    , "TAGame.PRI_TA:ReplicatedGameEvent"
    , "TAGame.Team_TA:GameEvent"
    , "TAGame.Team_TA:LogoData"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are floats.
floatProperties :: Set.Set StrictText.Text
floatProperties =
    [ "Engine.Actor:DrawScale"
    , "TAGame.Ball_TA:ReplicatedAddedCarBounceScale"
    , "TAGame.Ball_TA:ReplicatedBallMaxLinearSpeedScale"
    , "TAGame.Ball_TA:ReplicatedBallScale"
    , "TAGame.Ball_TA:ReplicatedWorldBounceScale"
    , "TAGame.CarComponent_Boost_TA:BoostModifier"
    , "TAGame.CarComponent_Boost_TA:RechargeDelay"
    , "TAGame.CarComponent_Boost_TA:RechargeRate"
    , "TAGame.CarComponent_FlipCar_TA:FlipCarTime"
    , "TAGame.CrowdActor_TA:ModifiedNoise"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are game modes.
gameModeProperties :: Set.Set StrictText.Text
gameModeProperties =
    [ "TAGame.GameEvent_TA:GameMode"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are integers.
intProperties :: Set.Set StrictText.Text
intProperties =
    [ "Engine.PlayerReplicationInfo:PlayerID"
    , "Engine.PlayerReplicationInfo:Score"
    , "Engine.TeamInfo:Score"
    , "ProjectX.GRI_X:ReplicatedGameMutatorIndex"
    , "ProjectX.GRI_X:ReplicatedGamePlaylist"
    , "TAGame.CrowdActor_TA:ReplicatedCountDownNumber"
    , "TAGame.GameEvent_Soccar_TA:RoundNum"
    , "TAGame.GameEvent_Soccar_TA:SecondsRemaining"
    , "TAGame.GameEvent_TA:BotSkill"
    , "TAGame.GameEvent_TA:ReplicatedGameStateTimeRemaining"
    , "TAGame.GameEvent_TA:ReplicatedStateName"
    , "TAGame.GameEvent_Team_TA:MaxTeamSize"
    , "TAGame.PRI_TA:MatchAssists"
    , "TAGame.PRI_TA:MatchGoals"
    , "TAGame.PRI_TA:MatchSaves"
    , "TAGame.PRI_TA:MatchScore"
    , "TAGame.PRI_TA:MatchShots"
    , "TAGame.PRI_TA:Title"
    , "TAGame.PRI_TA:TotalXP"
    , "TAGame.Team_Soccar_TA:GameScore"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are online loadouts.
loadoutOnlineProperties :: Set.Set StrictText.Text
loadoutOnlineProperties =
    [ "TAGame.PRI_TA:ClientLoadoutOnline"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are loadouts.
loadoutProperties :: Set.Set StrictText.Text
loadoutProperties =
    [ "TAGame.PRI_TA:ClientLoadout"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are locations.
locationProperties :: Set.Set StrictText.Text
locationProperties =
    [ "Engine.Actor:RelativeLocation"
    , "TAGame.CarComponent_Dodge_TA:DodgeTorque"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are music stingers.
musicStingerProperties :: Set.Set StrictText.Text
musicStingerProperties =
    [ "TAGame.GameEvent_Soccar_TA:ReplicatedMusicStinger"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are pickups.
pickupProperties :: Set.Set StrictText.Text
pickupProperties =
    [ "TAGame.VehiclePickup_TA:ReplicatedPickupData"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are private match settings.
privateMatchSettingsProperties :: Set.Set StrictText.Text
privateMatchSettingsProperties =
    [ "TAGame.GameEvent_SoccarPrivate_TA:MatchSettings"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are qwords.
qWordProperties :: Set.Set StrictText.Text
qWordProperties =
    [ "ProjectX.GRI_X:GameServerID"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are relation rotations.
relativeRotationProperties :: Set.Set StrictText.Text
relativeRotationProperties =
    [ "Engine.Actor:RelativeRotation"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are reservations.
reservationProperties :: Set.Set StrictText.Text
reservationProperties =
    [ "ProjectX.GRI_X:Reservations"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are rigid body states.
rigidBodyStateProperties :: Set.Set StrictText.Text
rigidBodyStateProperties =
    [ "TAGame.RBActor_TA:ReplicatedRBState"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are strings.
stringProperties :: Set.Set StrictText.Text
stringProperties =
    [ "Engine.GameReplicationInfo:ServerName"
    , "Engine.PlayerReplicationInfo:PlayerName"
    , "Engine.PlayerReplicationInfo:RemoteUserData"
    , "TAGame.GRI_TA:NewDedicatedServerIP"
    , "TAGame.Team_TA:CustomTeamName"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are team paints.
teamPaintProperties :: Set.Set StrictText.Text
teamPaintProperties =
    [ "TAGame.Car_TA:TeamPaint"
    ] & map StrictText.pack & Set.fromList


-- | A set of properties that are unique IDs.
uniqueIdProperties :: Set.Set StrictText.Text
uniqueIdProperties =
    [ "Engine.PlayerReplicationInfo:UniqueId"
    -- , "TAGame.PRI_TA:PartyLeader"
    ] & map StrictText.pack & Set.fromList