using System.Diagnostics.CodeAnalysis;
using System.Threading.Tasks;
using CliFx;
using DiscordChatExporter.Cli.Commands;
using DiscordChatExporter.Cli.Commands.Converters;
using DiscordChatExporter.Core.Exporting.Filtering;
using DiscordChatExporter.Core.Exporting.Partitioning;

namespace DiscordChatExporter.Cli;

public static class Program
{
    // Explicit references because CliFx relies on reflection and we're publishing with trimming enabled
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ExportAllCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ExportChannelsCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ExportDirectMessagesCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(ExportGuildCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(GetChannelsCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(GetDirectChannelsCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(GetGuildsCommand))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(GuideCommand))]
    [DynamicDependency(
        DynamicallyAccessedMemberTypes.All,
        typeof(ThreadInclusionModeBindingConverter)
    )]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(TruthyBooleanBindingConverter))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(PartitionLimit))]
    [DynamicDependency(DynamicallyAccessedMemberTypes.All, typeof(MessageFilter))]
    public static async Task<int> Main(string[] args) =>
        await new CliApplicationBuilder()
            .AddCommand<ExportAllCommand>()
            .AddCommand<ExportChannelsCommand>()
            .AddCommand<ExportDirectMessagesCommand>()
            .AddCommand<ExportGuildCommand>()
            .AddCommand<GetChannelsCommand>()
            .AddCommand<GetDirectChannelsCommand>()
            .AddCommand<GetGuildsCommand>()
            .AddCommand<GuideCommand>()
            .Build()
            .RunAsync(args);
}