using System.ComponentModel.DataAnnotations;
using System.Text.Json;

namespace ReportingServices.UI.Models.Binder;

public class AppSettings
{

#nullable disable

    [Display(Name = "Base API Address"), Required] public string BaseAPIAddress { get; set; }
    [Display(Name = "Build Number"), Required] public string BuildNumber { get; set; }
    [Display(Name = "Company"), Required] public string Company { get; set; }
    [Display(Name = "Daily Report File Path"), Required] public string DailyReportFilePath { get; set; }
    [Display(Name = "Git Commit Seven"), Required] public string GitCommitSeven { get; set; }
    [Display(Name = "Logging Directory"), Required] public string LoggingDirectory { get; set; }
    [Display(Name = "Is Development"), Required] public bool? IsDevelopment { get; set; }
    [Display(Name = "Is Staging"), Required] public bool? IsStaging { get; set; }
    [Display(Name = "MonA Resource"), Required] public string MonAResource { get; set; }
    [Display(Name = "MonA Site"), Required] public string MonASite { get; set; }
    [Display(Name = "SLL File Path"), Required] public string SLLFilePath { get; set; }
    [Display(Name = "Tool State Owner File Path"), Required] public string ToolStateOwnerFilePath { get; set; }

#nullable enable

    public override string ToString()
    {
        string result = JsonSerializer.Serialize(this, new JsonSerializerOptions() { WriteIndented = true });
        return result;
    }

    private static Models.AppSettings Get(AppSettings? appSettings)
    {
        Models.AppSettings result;
        if (appSettings is null)
            throw new NullReferenceException(nameof(appSettings));
        if (appSettings.BaseAPIAddress is null)
            throw new NullReferenceException(nameof(BaseAPIAddress));
        if (appSettings.BuildNumber is null)
            throw new NullReferenceException(nameof(BuildNumber));
        if (appSettings.Company is null)
            throw new NullReferenceException(nameof(Company));
        if (appSettings.DailyReportFilePath is null)
            throw new NullReferenceException(nameof(DailyReportFilePath));
        if (appSettings.GitCommitSeven is null)
            throw new NullReferenceException(nameof(GitCommitSeven));
        if (appSettings.LoggingDirectory is null)
            throw new NullReferenceException(nameof(LoggingDirectory));
        if (appSettings.IsDevelopment is null)
            throw new NullReferenceException(nameof(IsDevelopment));
        if (appSettings.IsStaging is null)
            throw new NullReferenceException(nameof(IsStaging));
        if (appSettings.MonAResource is null)
            throw new NullReferenceException(nameof(MonAResource));
        if (appSettings.MonASite is null)
            throw new NullReferenceException(nameof(MonASite));
        if (appSettings.SLLFilePath is null)
            throw new NullReferenceException(nameof(SLLFilePath));
        if (appSettings.ToolStateOwnerFilePath is null)
            throw new NullReferenceException(nameof(ToolStateOwnerFilePath));
        result = new(
            appSettings.BaseAPIAddress,
            appSettings.BuildNumber,
            appSettings.Company,
            appSettings.DailyReportFilePath,
            appSettings.GitCommitSeven,
            appSettings.LoggingDirectory,
            appSettings.IsDevelopment.Value,
            appSettings.IsStaging.Value,
            appSettings.MonAResource,
            appSettings.MonASite,
            appSettings.SLLFilePath,
            appSettings.ToolStateOwnerFilePath);
        return result;
    }

    public static Models.AppSettings Get(IConfigurationRoot configurationRoot)
    {
        Models.AppSettings result;
        AppSettings? appSettings = configurationRoot.Get<AppSettings>();
        result = Get(appSettings);
        return result;
    }

}