using ConfigurationPannel.Services; using Inspectron.Epson; using Inspectron.Epson.PrintServer.ConfigurationSources; using Inspectron.Epson.PrintServer.PrintServices; using Inspectron.Epson.PrintServer.WorkAreaSources; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.RazorPages; using System.Reflection; using ConfigurationManager = ConfigurationPannel.Services.ConfigurationManager; namespace ConfigurationPannel.Pages; [Authorize] public class ConfigureModel : PageModel { private readonly ConfigurationManager _configManager; private readonly PrintServerHostedService _printServerService; private readonly LogoService _logoService; private readonly IWebHostEnvironment _env; private readonly DiscoveryService _discoveryService; private readonly ILogger _logger; public ConfigureModel( ConfigurationManager configManager, PrintServerHostedService printServerService, LogoService logoService, IWebHostEnvironment env, ILogger logger) { _configManager = configManager; _printServerService = printServerService; _logoService = logoService; _env = env; _discoveryService = new DiscoveryService(); _logger = logger; } public List WorkAreas { get; set; } = new(); public List DiscoveredPrinters { get; set; } = new(); public Dictionary CurrentAssignments { get; set; } = new(); public List AvailableLogos { get; set; } = new(); [BindProperty] public List WorkAreaAssignments { get; set; } = new(); [BindProperty] public IFormFile? UploadedLogo { get; set; } public string SuccessMessage { get; set; } = string.Empty; public string ErrorMessage { get; set; } = string.Empty; public async Task OnGetAsync() { try { // Load current configuration var config = await _configManager.LoadConfigurationAsync(); // Get work areas from API var workAreaSource = new JamesWorkAreaSource(config); WorkAreas = await workAreaSource.GetWorkAreasAsync(); // Map current assignments CurrentAssignments = config.PrinterConfigurations .GroupBy(kv => kv.Value.AreaId) .ToDictionary(g => g.Key, g => g.First().Value); // Initial discovery (quick timeout for page load) DiscoveredPrinters = await _discoveryService.DiscoverPrintersAsync(TimeSpan.FromSeconds(3)); // Load available logos AvailableLogos = _logoService.GetAllLogos(); } catch (Exception ex) { _logger.LogError(ex, "Error loading configuration page"); ErrorMessage = "Error loading configuration: " + ex.Message; } return Page(); } public async Task OnPostDiscoverAsync() { try { var printers = await _discoveryService.DiscoverPrintersAsync(TimeSpan.FromSeconds(5)); return new JsonResult(printers.Select(p => new { ipAddress = p.IPAddress, modelName = p.ModelName, macAddress = p.MACAddress })); } catch (Exception ex) { _logger.LogError(ex, "Error discovering printers"); return new JsonResult(new { error = ex.Message }) { StatusCode = 500 }; } } public async Task OnPostUploadLogoAsync() { try { if (UploadedLogo != null) { var filename = await _logoService.SaveLogoAsync(UploadedLogo); SuccessMessage = $"Logo uploaded successfully: {filename}"; } else { ErrorMessage = "No file selected"; } } catch (Exception ex) { _logger.LogError(ex, "Error uploading logo"); ErrorMessage = "Error uploading logo: " + ex.Message; } return await OnGetAsync(); } public async Task OnPostCleanLogosAsync() { try { var config = await _configManager.LoadConfigurationAsync(); var usedLogos = config.PrinterConfigurations.Values .Select(p => p.LogoFilename) .Where(f => !string.IsNullOrEmpty(f)) .ToList(); var cleanedLogos = _logoService.CleanUnusedLogos(usedLogos!); if (cleanedLogos.Any()) { SuccessMessage = $"Cleaned {cleanedLogos.Count} unused logo(s): {string.Join(", ", cleanedLogos)}"; } else { SuccessMessage = "No unused logos found"; } } catch (Exception ex) { _logger.LogError(ex, "Error cleaning logos"); ErrorMessage = "Error cleaning logos: " + ex.Message; } return await OnGetAsync(); } public async Task OnPostSaveAsync() { try { // Load current config var config = await _configManager.LoadConfigurationAsync(); // Clear existing printer configurations var newPrinterConfigurations = new Dictionary(); // Build new configurations from assignments foreach (var assignment in WorkAreaAssignments) { if (!string.IsNullOrEmpty(assignment.PrinterAddress)) { var printerKey = assignment.PrinterAddress; if (!newPrinterConfigurations.ContainsKey(printerKey)) { newPrinterConfigurations[printerKey] = new PrinterConfiguration { Address = assignment.PrinterAddress, AreaId = assignment.WorkAreaId, FontSize = assignment.FontSize, LogoFilename = assignment.LogoFilename }; // Copy logo to printer service directory if (!string.IsNullOrEmpty(assignment.LogoFilename)) { var printerServicePath = Path.Combine("logos"); _logoService.CopyLogoToDirectory(assignment.LogoFilename, printerServicePath); } } } } // Update configuration config.PrinterConfigurations = newPrinterConfigurations; // Save configuration await _configManager.SaveConfigurationAsync(config); // Restart PrintLoop with new configuration await _printServerService.RestartAsync(); SuccessMessage = "Configuration saved and print server restarted successfully!"; _logger.LogInformation("Configuration saved successfully"); // Reload page data return await OnGetAsync(); } catch (Exception ex) { _logger.LogError(ex, "Error saving configuration"); ErrorMessage = "Error saving configuration: " + ex.Message; return await OnGetAsync(); } } } public class WorkAreaAssignment { public string WorkAreaId { get; set; } = string.Empty; public string WorkAreaName { get; set; } = string.Empty; public string PrinterAddress { get; set; } = string.Empty; public int FontSize { get; set; } = 1; public string? LogoFilename { get; set; } }