using Boyfriend.Data.Options;
using Boyfriend.Responders;
using Remora.Discord.API.Abstractions.Objects;

namespace Boyfriend.Data;

/// <summary>
///     Contains all per-guild settings that can be set by a member
///     with <see cref="DiscordPermission.ManageGuild" /> using the /settings command
/// </summary>
public static class GuildSettings
{
    public static readonly LanguageOption Language = new("Language", "en");

    /// <summary>
    ///     Controls what message should be sent in <see cref="PublicFeedbackChannel" /> when a new member joins the server.
    /// </summary>
    /// <remarks>
    ///     <list type="bullet">
    ///         <item>No message will be sent if set to "off", "disable" or "disabled".</item>
    ///         <item><see cref="Messages.DefaultWelcomeMessage" /> will be sent if set to "default" or "reset"</item>
    ///     </list>
    /// </remarks>
    /// <seealso cref="GuildMemberJoinedResponder" />
    public static readonly Option<string> WelcomeMessage = new("WelcomeMessage", "default");

    /// <summary>
    ///     Controls whether or not the <see cref="Messages.Ready" /> message should be sent
    ///     in <see cref="PrivateFeedbackChannel" /> on startup.
    /// </summary>
    /// <seealso cref="GuildLoadedResponder" />
    public static readonly BoolOption ReceiveStartupMessages = new("ReceiveStartupMessages", false);

    public static readonly BoolOption RemoveRolesOnMute = new("RemoveRolesOnMute", false);

    /// <summary>
    ///     Controls whether or not a guild member's roles are returned if he/she leaves and then joins back.
    /// </summary>
    /// <remarks>Roles will not be returned if the member left the guild because of /ban or /kick.</remarks>
    public static readonly BoolOption ReturnRolesOnRejoin = new("ReturnRolesOnRejoin", false);

    public static readonly BoolOption AutoStartEvents = new("AutoStartEvents", false);

    /// <summary>
    ///     Controls whether or not users who try to hoist themselves should be renamed.
    /// </summary>
    public static readonly BoolOption RenameHoistedUsers = new("RenameHoistedUsers", false);

    /// <summary>
    ///     Controls what channel should all public messages be sent to.
    /// </summary>
    public static readonly SnowflakeOption PublicFeedbackChannel = new("PublicFeedbackChannel");

    /// <summary>
    ///     Controls what channel should all private, moderator-only messages be sent to.
    /// </summary>
    public static readonly SnowflakeOption PrivateFeedbackChannel = new("PrivateFeedbackChannel");

    public static readonly SnowflakeOption EventNotificationChannel = new("EventNotificationChannel");
    public static readonly SnowflakeOption DefaultRole = new("DefaultRole");
    public static readonly SnowflakeOption MuteRole = new("MuteRole");
    public static readonly SnowflakeOption EventNotificationRole = new("EventNotificationRole");

    /// <summary>
    ///     Controls the amount of time before a scheduled event to send a reminder in <see cref="EventNotificationChannel" />.
    /// </summary>
    public static readonly TimeSpanOption EventEarlyNotificationOffset = new(
        "EventEarlyNotificationOffset", TimeSpan.Zero);
}