using Inspectron.Epson.PrintServer.ConfigurationSources;

namespace EpsonPrintService;

public record ConfigLoadResult(bool Success, EpsonPrintServiceConfiguration? Config, string? Error);

public static class ConfigurationLoader
{
    public static ConfigLoadResult TryLoadFromBase64(string base64Content)
    {
        try
        {
            var decoded = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(base64Content.Trim()));
            var parts = decoded.Split(';');
            if (parts.Length != 3)
                return new ConfigLoadResult(false, null, $"Invalid configuration format. Expected 'apiUrl;restaurantId;apiKey', got {parts.Length} parts.");

            var config = new EpsonPrintServiceConfiguration
            {
                ApiUrl = parts[0],
                RestaurantId = parts[1],
                ApiKey = parts[2]
            };

            if (string.IsNullOrWhiteSpace(config.ApiUrl) || string.IsNullOrWhiteSpace(config.RestaurantId) || string.IsNullOrWhiteSpace(config.ApiKey))
                return new ConfigLoadResult(false, null, "Configuration contains empty values.");

            return new ConfigLoadResult(true, config, null);
        }
        catch (FormatException)
        {
            return new ConfigLoadResult(false, null, "Invalid base64 content.");
        }
    }

    public static ConfigLoadResult TryLoadFromFile()
    {
        try
        {
            var configPath = ConfigurationPaths.GetConfigPath();
            if (!File.Exists(configPath))
                return new ConfigLoadResult(false, null, $"Configuration file not found: {configPath}");

            var base64Line = File.ReadAllText(configPath).Trim();
            if (string.IsNullOrWhiteSpace(base64Line))
                return new ConfigLoadResult(false, null, "Configuration file is empty.");

            return TryLoadFromBase64(base64Line);
        }
        catch (Exception ex)
        {
            return new ConfigLoadResult(false, null, $"Failed to read configuration: {ex.Message}");
        }
    }
}
