using Content.Server.GameObjects.Components.Cargo; using Content.Shared.Prototypes.Cargo; using System; using System.Collections.Generic; namespace Content.Server.Cargo { public class CargoOrderDataManager : ICargoOrderDataManager { private readonly Dictionary _accounts = new Dictionary(); private readonly List _components = new List(); public CargoOrderDataManager() { CreateAccount(0); } public void CreateAccount(int id) { _accounts.Add(id, new CargoOrderDatabase(id)); } public bool TryGetAccount(int id, out CargoOrderDatabase account) { if (_accounts.TryGetValue(id, out var _account)) { account = _account; return true; } account = null; return false; } /// /// Adds an order to the database. /// /// The person who requested the item. /// The reason the product was requested. /// The ID of the product requested. /// The amount of the products requested. /// The ID of the bank account paying for the order. /// Whether the order will be bought when the orders are processed. public virtual void AddOrder(int id, string requester, string reason, string productId, int amount, int payingAccountId) { if (amount < 1 || !TryGetAccount(id, out var account)) return; account.AddOrder(requester, reason, productId, amount, payingAccountId); SyncComponentsWithId(id); } public void RemoveOrder(int id, int orderNumber) { if (!TryGetAccount(id, out var account)) return; account.RemoveOrder(orderNumber); SyncComponentsWithId(id); } public void ApproveOrder(int id, int orderNumber) { if (!TryGetAccount(id, out var account)) return; account.ApproveOrder(orderNumber); SyncComponentsWithId(id); } private void SyncComponentsWithId(int id) { foreach (var component in _components) { if (!component.ConnectedToDatabase || component.Database.Id != id) continue; component.Dirty(); } } public List RemoveAndGetApprovedFrom(CargoOrderDatabase database) { var approvedOrders = database.SpliceApproved(); SyncComponentsWithId(database.Id); return approvedOrders; } public void AddComponent(CargoOrderDatabaseComponent component) { if (_components.Contains(component)) return; _components.Add(component); component.Database = _accounts[0]; } public List GetOrdersFromAccount(int accountId) { if (!TryGetAccount(accountId, out var account)) return null; return account.GetOrders(); } public (int CurrentCapacity, int MaxCapacity) GetCapacity(int id) { TryGetAccount(id, out var account); return (account.CurrentOrderSize, account.MaxOrderSize); } } }