using Microsoft.Extensions.Logging; public class PrintServer { private readonly IPrintService _printService; private readonly ILogger _logger; private readonly Dictionary _printerQueues; public PrintServer(IPrintService printService, ILogger logger) { _printService = printService; _logger = logger; _printerQueues = new Dictionary(); } public void RegisterPrinter(string printerIp) { if (_printerQueues.ContainsKey(printerIp)) return; var queue = new PrinterQueue(printerIp, _printService,_logger); _printerQueues[printerIp] = queue; queue.Start(); Console.WriteLine($"Printer {printerIp} registered"); } public void UnregisterPrinter(string printerIp) { if (_printerQueues.TryGetValue(printerIp, out var queue)) { queue.StopAsync().Wait(); _printerQueues.Remove(printerIp); Console.WriteLine($"Printer {printerIp} unregistered"); } } public void SubmitJob(string printerIp, PrintJob job) { if (_printerQueues.TryGetValue(printerIp, out var queue)) { queue.Enqueue(job); } else { _logger.LogWarning( $"Printer {printerIp} not found. Job cannot be submitted."); } } public Dictionary GetQueueStatus() { var status = new Dictionary(); foreach (var kvp in _printerQueues) { status[kvp.Key] = kvp.Value.QueueLength; } return status; } public async Task ShutdownAsync() { var stopTasks = _printerQueues.Values.Select(q => q.StopAsync()); await Task.WhenAll(stopTasks); Console.WriteLine("Print server shut down"); } }