#nullable disable
using EllieBot.Common.Configs;

namespace EllieBot.Modules.Xp.Services;

public sealed class XpConfigService : ConfigServiceBase<XpConfig>
{
    private const string FILE_PATH = "data/xp.yml";
    private static readonly TypedKey<XpConfig> _changeKey = new("config.xp.updated");

    public override string Name
        => "xp";

    public XpConfigService(IConfigSeria serializer, IPubSub pubSub)
        : base(FILE_PATH, serializer, pubSub, _changeKey)
    {
        AddParsedProp("txt.cooldown",
            conf => conf.MessageXpCooldown,
            int.TryParse,
            ConfigPrinters.ToString,
            x => x > 0);
        AddParsedProp("txt.per_msg", conf => conf.XpPerMessage, int.TryParse, ConfigPrinters.ToString, x => x >= 0);
        AddParsedProp("txt.per_image", conf => conf.XpFromImage, int.TryParse, ConfigPrinters.ToString, x => x > 0);

        AddParsedProp("voice.per_minute",
            conf => conf.VoiceXpPerMinute,
            double.TryParse,
            ConfigPrinters.ToString,
            x => x >= 0);
        AddParsedProp("voice.max_minutes",
            conf => conf.VoiceMaxMinutes,
            int.TryParse,
            ConfigPrinters.ToString,
            x => x > 0);

        AddParsedProp("shop.is_enabled",
            conf => conf.Shop.IsEnabled,
            bool.TryParse,
            ConfigPrinters.ToString);

        Migrate();
    }

    private void Migrate()
    {
        if (data.Version < 2)
        {
            ModifyConfig(c =>
            {
                c.Version = 2;
                c.XpFromImage = 0;
            });
        }
        
        if (data.Version < 7)
        {
            ModifyConfig(c =>
            {
                c.Version = 7;
                c.MessageXpCooldown *= 60;
            });
        }
    }
}