using LibHac.Common;
using LibHac.Fs;
using LibHac.FsSystem;
using LibHac.Ncm;
using LibHac.Tools.Fs;
using ContentType = LibHac.Ncm.ContentType;

namespace hactoolnet;

internal static class EnumStrings
{
    public static string Print(this ContentType value)
    {
        return value switch
        {
            ContentType.Meta => nameof(ContentType.Meta),
            ContentType.Program => nameof(ContentType.Program),
            ContentType.Data => nameof(ContentType.Data),
            ContentType.Control => nameof(ContentType.Control),
            ContentType.HtmlDocument => nameof(ContentType.HtmlDocument),
            ContentType.LegalInformation => nameof(ContentType.LegalInformation),
            ContentType.DeltaFragment => nameof(ContentType.DeltaFragment),
            _ => value.ToString()
        };
    }

    public static string Print(this ContentMetaType value)
    {
        return value switch
        {
            ContentMetaType.SystemProgram => nameof(ContentMetaType.SystemProgram),
            ContentMetaType.SystemData => nameof(ContentMetaType.SystemData),
            ContentMetaType.SystemUpdate => nameof(ContentMetaType.SystemUpdate),
            ContentMetaType.BootImagePackage => nameof(ContentMetaType.BootImagePackage),
            ContentMetaType.BootImagePackageSafe => nameof(ContentMetaType.BootImagePackageSafe),
            ContentMetaType.Application => nameof(ContentMetaType.Application),
            ContentMetaType.Patch => nameof(ContentMetaType.Patch),
            ContentMetaType.AddOnContent => nameof(ContentMetaType.AddOnContent),
            ContentMetaType.Delta => nameof(ContentMetaType.Delta),
            _ => value.ToString()
        };
    }

    public static string Print(this DistributionType value)
    {
        return value switch
        {
            DistributionType.Download => nameof(DistributionType.Download),
            DistributionType.GameCard => nameof(DistributionType.GameCard),
            _ => value.ToString()
        };
    }

    public static string Print(this NcaContentType value)
    {
        return value switch
        {
            NcaContentType.Program => nameof(NcaContentType.Program),
            NcaContentType.Meta => nameof(NcaContentType.Meta),
            NcaContentType.Control => nameof(NcaContentType.Control),
            NcaContentType.Manual => nameof(NcaContentType.Manual),
            NcaContentType.Data => nameof(NcaContentType.Data),
            NcaContentType.PublicData => nameof(NcaContentType.PublicData),
            _ => value.ToString()
        };
    }

    public static string Print(this NcaFormatType value)
    {
        return value switch
        {
            NcaFormatType.Romfs => nameof(NcaFormatType.Romfs),
            NcaFormatType.Pfs0 => nameof(NcaFormatType.Pfs0),
            _ => value.ToString()
        };
    }

    public static string Print(this XciPartitionType value)
    {
        return value switch
        {
            XciPartitionType.Update => nameof(XciPartitionType.Update),
            XciPartitionType.Normal => nameof(XciPartitionType.Normal),
            XciPartitionType.Secure => nameof(XciPartitionType.Secure),
            XciPartitionType.Logo => nameof(XciPartitionType.Logo),
            XciPartitionType.Root => nameof(XciPartitionType.Root),
            _ => value.ToString()
        };
    }

    public static string Print(this Validity value)
    {
        return value switch
        {
            Validity.Unchecked => nameof(Validity.Unchecked),
            Validity.Invalid => nameof(Validity.Invalid),
            Validity.Valid => nameof(Validity.Valid),
            Validity.MissingKey => nameof(Validity.MissingKey),
            _ => value.ToString()
        };
    }

    public static string Print(this SaveDataType value)
    {
        return value switch
        {
            SaveDataType.System => nameof(SaveDataType.System),
            SaveDataType.Account => nameof(SaveDataType.Account),
            SaveDataType.Bcat => nameof(SaveDataType.Bcat),
            SaveDataType.Device => nameof(SaveDataType.Device),
            SaveDataType.Temporary => nameof(SaveDataType.Temporary),
            SaveDataType.Cache => nameof(SaveDataType.Cache),
            SaveDataType.SystemBcat => nameof(SaveDataType.SystemBcat),
            _ => value.ToString()
        };
    }
}