using Content.Shared.Chemistry.Reagent;
using Robust.Shared.GameStates;
using Robust.Shared.Prototypes;
using Content.Shared.Containers.ItemSlots;
using Content.Shared.Materials;
using Robust.Shared.Serialization;
using Robust.Shared.Audio;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
namespace Content.Shared._Sunrise.CopyMachine;
[RegisterComponent, NetworkedComponent, AutoGenerateComponentState, AutoGenerateComponentPause]
public sealed partial class CopyMachineComponent : Component
{
///
/// Максимальное количество заданий в очереди принтера
///
[ViewVariables(VVAccess.ReadWrite)]
public int MaxQueueSize = 5;
[DataField, AutoNetworkedField]
public CopyMachineJobView? CurrentJobView;
[DataField]
public SoundSpecifier PrintSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/printer.ogg");
/// Время выполнения одной печати, копии(в секундах)
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public float JobDuration = 4f;
///
/// Очередь заданий на печать или копирование
///
public Queue<(CopyMachineJobType Type, string? TemplateId)> JobQueue = new();
///
/// Идёт ли сейчас выполнение задания
///
[ViewVariables]
public bool IsProcessing = false;
///
/// ID слота для копируемой бумаги
///
public const string CopySlotId = "paper_copy";
///
/// Слот для вставляемого листа бумаги, который можно скопировать
///
[DataField(required: true)]
public ItemSlot CopySlot = new();
///
/// Прототип материала бумаги (используется для проверки количества бумаги в принтере)
///
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public ProtoId PaperMaterial = "officePaper";
///
/// Прототип сущности бумаги, которую принтер создаёт при печати
///
[DataField]
public EntProtoId PaperProtoId = "Paper";
///
/// Прототип реагента чернил, используемых принтером
///
[DataField]
[ViewVariables(VVAccess.ReadWrite)]
public ProtoId IncReagentProto = "Inc";
///
/// Название раствора с чернилами внутри принтера
///
[DataField]
public string Solution = string.Empty;
///
/// Сколько чернил тратится на печать одного листа
///
[DataField]
public int IncCost = 1;
///
/// Сколько материала бумаги тратится на один лист (в условных единицах материала)
///
[DataField]
public int PaperCost = 100;
///
/// Доступные шаблоны документов для печати
///
[DataField]
public List> Templates = new();
///
/// Время, когда можно начать следующий принт (серверное время)
///
[DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), AutoPausedField]
public TimeSpan NextPrintTime = TimeSpan.Zero;
[Serializable, NetSerializable]
public sealed record PrinterJobView(string Type, string? TemplateId);
}