using Content.Server.Atmos;
using Content.Server.Disposal.Tube.Components;
using Content.Shared.Atmos;
using Content.Shared.Body.Components;
using Content.Shared.Item;
using Robust.Shared.Containers;
using Robust.Shared.Physics;
namespace Content.Server.Disposal.Unit.Components
{
// TODO: Add gas
[RegisterComponent]
public sealed class DisposalHolderComponent : Component, IGasMixtureHolder
{
[Dependency] private readonly IEntityManager _entMan = default!;
public Container Container = null!;
///
/// The total amount of time that it will take for this entity to
/// be pushed to the next tube
///
[ViewVariables]
public float StartingTime { get; set; }
///
/// Time left until the entity is pushed to the next tube
///
[ViewVariables]
public float TimeLeft { get; set; }
[ViewVariables]
public IDisposalTubeComponent? PreviousTube { get; set; }
[ViewVariables]
public Direction PreviousDirection { get; set; } = Direction.Invalid;
[ViewVariables]
public Direction PreviousDirectionFrom => (PreviousDirection == Direction.Invalid) ? Direction.Invalid : PreviousDirection.GetOpposite();
[ViewVariables]
public IDisposalTubeComponent? CurrentTube { get; set; }
// CurrentDirection is not null when CurrentTube isn't null.
[ViewVariables]
public Direction CurrentDirection { get; set; } = Direction.Invalid;
/// Mistake prevention
[ViewVariables]
public bool IsExitingDisposals { get; set; } = false;
///
/// A list of tags attached to the content, used for sorting
///
[ViewVariables]
public HashSet Tags { get; set; } = new();
[ViewVariables]
[DataField("air")]
public GasMixture Air { get; set; } = new (70);
protected override void Initialize()
{
base.Initialize();
Container = ContainerHelpers.EnsureContainer(Owner, nameof(DisposalHolderComponent));
}
private bool CanInsert(EntityUid entity)
{
if (!Container.CanInsert(entity))
{
return false;
}
return _entMan.HasComponent(entity) ||
_entMan.HasComponent(entity);
}
public bool TryInsert(EntityUid entity)
{
if (!CanInsert(entity) || !Container.Insert(entity))
{
return false;
}
if (_entMan.TryGetComponent(entity, out IPhysBody? physics))
{
physics.CanCollide = false;
}
return true;
}
}
}