namespace ExpenseTracker.Domain.Enums;

public abstract class Category : Enumeration<Category>
{
    public static readonly Category Savings = new SavingsCategory();
    public static readonly Category Investments = new InvestmentsCategory();
    public static readonly Category Housing = new HousingCategory();
    public static readonly Category Transportation = new TransportationCategory();
    public static readonly Category Groceries = new GroceriesCategory();
    public static readonly Category Utilities = new UtilitiesCategory();
    public static readonly Category HealthCare = new HealthCareCategory();
    public static readonly Category LifeInsurance = new LifeInsuranceCategory();
    public static readonly Category Childcare = new ChildcareCategory();
    public static readonly Category PersonalDebts = new PersonalDebtsCategory();
    public static readonly Category ClothingAndAccessories = new ClothingAndAccessoriesCategory();
    public static readonly Category GymMembership = new GymMembershipCategory();
    public static readonly Category PersonalProducts = new PersonalProductsCategory();
    public static readonly Category Entertainment = new EntertainmentCategory();
    public static readonly Category GadgetsAndElectronics = new GadgetsAndElectronicsCategory();
    public static readonly Category Gifts = new GiftsCategory();
    public static readonly Category Donations = new DonationsCategory();
    public static readonly Category Travel = new TravelCategory();
    public static readonly Category InitialBalance = new InitialBalanceCategory();

    protected Category(int value, string name) : base(value, name) { }

    private sealed class AllCategory : Category
    {
        public AllCategory() : base(0, "Savings") { }
    }

    private sealed class SavingsCategory : Category
    {
        public SavingsCategory() : base(1, "Savings") { }
    }

    private sealed class InvestmentsCategory : Category
    {
        public InvestmentsCategory() : base(2, "Investments") { }
    }

    private sealed class HousingCategory : Category
    {
        public HousingCategory() : base(3, "Housing") { }
    }

    private sealed class TransportationCategory : Category
    {
        public TransportationCategory() : base(4, "Transportation") { }
    }

    private sealed class GroceriesCategory : Category
    {
        public GroceriesCategory() : base(5, "Groceries") { }
    }

    private sealed class UtilitiesCategory : Category
    {
        public UtilitiesCategory() : base(6, "Utilities") { }
    }

    private sealed class HealthCareCategory : Category
    {
        public HealthCareCategory() : base(7, "Health") { }
    }

    private sealed class LifeInsuranceCategory : Category
    {
        public LifeInsuranceCategory() : base(8, "LifeInsurance") { }
    }

    private sealed class ChildcareCategory : Category
    {
        public ChildcareCategory() : base(9, "Childcare") { }
    }

    private sealed class PersonalDebtsCategory : Category
    {
        public PersonalDebtsCategory() : base(10, "PersonalDebts") { }
    }

    private sealed class ClothingAndAccessoriesCategory : Category
    {
        public ClothingAndAccessoriesCategory() : base(11, "ClothingAndAccessories") { }
    }

    private sealed class GymMembershipCategory : Category
    {
        public GymMembershipCategory() : base(12, "GymMembership") { }
    }

    private sealed class PersonalProductsCategory : Category
    {
        public PersonalProductsCategory() : base(13, "PersonalProducts") { }
    }

    private sealed class EntertainmentCategory : Category
    {
        public EntertainmentCategory() : base(14, "Entertainment") { }
    }

    private sealed class GadgetsAndElectronicsCategory : Category
    {
        public GadgetsAndElectronicsCategory() : base(15, "GadgetsAndElectronics") { }
    }

    private sealed class GiftsCategory : Category
    {
        public GiftsCategory() : base(16, "Gifts") { }
    }

    private sealed class DonationsCategory : Category
    {
        public DonationsCategory() : base(17, "Donations") { }
    }

    private sealed class TravelCategory : Category
    {
        public TravelCategory() : base(18, "Travel") { }
    }

    private sealed class InitialBalanceCategory : Category
    {
        public InitialBalanceCategory() : base(19, "InitialBalance") { }
    }
}