using UnityEngine;
namespace Fusion.Addons.Physics {
  /// 
  /// Fusion component for handling Physics2D.Simulate().
  /// 
  [DisallowMultipleComponent]
  public class RunnerSimulatePhysics2D : RunnerSimulatePhysicsBase {
    /// 
    protected override void OverrideAutoSimulate(bool set) {
      _physicsAutoSimRestore = (PhysicsTimings)Physics2D.simulationMode;
      if (set) {
        Physics2D.simulationMode = (SimulationMode2D)_physicsTiming;
      } else {
        Physics2D.simulationMode = SimulationMode2D.Script;
      }
    }
    /// 
    protected override void RestoreAutoSimulate() {
      Physics2D.simulationMode = (SimulationMode2D)_physicsAutoSimRestore;
    }
    /// 
    protected override bool AutoSyncTransforms {
      get => Physics2D.autoSyncTransforms;
      set => Physics2D.autoSyncTransforms = value;
    }
    /// 
    protected override PhysicsTimings UnityPhysicsMode => (PhysicsTimings)Physics2D.simulationMode;
    /// 
    protected override void SimulatePrimaryScene(float deltaTime) {
      if (Runner.SceneManager.TryGetPhysicsScene2D(out var physicsScene)) {
        if (physicsScene.IsValid()) {
          physicsScene.Simulate(deltaTime);
        } else {
          Physics2D.Simulate(deltaTime);
        }
      }
    }
    /// 
    protected override void SimulateAdditionalScenes(float deltaTime, bool checkPhysicsSimulation) {
      if (_additionalScenes == null || _additionalScenes.Count == 0) {
        return;
      }
      var defaultPhysicsScene = Physics2D.defaultPhysicsScene;
      foreach (var scene in _additionalScenes) {
        if (!checkPhysicsSimulation || CanSimulatePhysics(scene.ClientPhysicsSimulation)) {
          if (scene.PhysicsScene != defaultPhysicsScene || Physics2D.simulationMode == SimulationMode2D.Script) {
            scene.PhysicsScene.Simulate(deltaTime);
          }
        }
      }
    }
  }
}