namespace PluralKit.Core;

public enum MemberPrivacySubject
{
    Visibility,
    Name,
    Description,
    Avatar,
    Birthday,
    Pronouns,
    Metadata
}

public static class MemberPrivacyUtils
{
    public static MemberPatch WithPrivacy(this MemberPatch member, MemberPrivacySubject subject, PrivacyLevel level)
    {
        // what do you mean switch expressions can't be statements >.>
        _ = subject switch
        {
            MemberPrivacySubject.Name => member.NamePrivacy = level,
            MemberPrivacySubject.Description => member.DescriptionPrivacy = level,
            MemberPrivacySubject.Avatar => member.AvatarPrivacy = level,
            MemberPrivacySubject.Pronouns => member.PronounPrivacy = level,
            MemberPrivacySubject.Birthday => member.BirthdayPrivacy = level,
            MemberPrivacySubject.Metadata => member.MetadataPrivacy = level,
            MemberPrivacySubject.Visibility => member.Visibility = level,
            _ => throw new ArgumentOutOfRangeException($"Unknown privacy subject {subject}")
        };

        return member;
    }

    public static MemberPatch WithAllPrivacy(this MemberPatch member, PrivacyLevel level)
    {
        foreach (var subject in Enum.GetValues(typeof(MemberPrivacySubject)))
            member.WithPrivacy((MemberPrivacySubject)subject, level);
        return member;
    }

    public static bool TryParseMemberPrivacy(string input, out MemberPrivacySubject subject)
    {
        switch (input.ToLowerInvariant())
        {
            case "name":
                subject = MemberPrivacySubject.Name;
                break;
            case "description":
            case "desc":
            case "text":
            case "info":
                subject = MemberPrivacySubject.Description;
                break;
            case "avatar":
            case "pfp":
            case "pic":
            case "icon":
                subject = MemberPrivacySubject.Avatar;
                break;
            case "birthday":
            case "birth":
            case "bday":
            case "birthdate":
            case "bdate":
                subject = MemberPrivacySubject.Birthday;
                break;
            case "pronouns":
            case "pronoun":
                subject = MemberPrivacySubject.Pronouns;
                break;
            case "meta":
            case "metadata":
            case "created":
                subject = MemberPrivacySubject.Metadata;
                break;
            case "visibility":
            case "hidden":
            case "shown":
            case "visible":
            case "list":
                subject = MemberPrivacySubject.Visibility;
                break;
            default:
                subject = MemberPrivacySubject.Name;
                return false;
        }

        return true;
    }
}