using System.Diagnostics.CodeAnalysis;
using Recyclarr.Cli.Pipelines.MediaNaming;
using Recyclarr.Cli.Pipelines.MediaNaming.PipelinePhases;
using Recyclarr.ServarrApi.MediaNaming;

namespace Recyclarr.Cli.Tests.Pipelines.MediaNaming;

[TestFixture]
[SuppressMessage("Reliability", "CA2000:Dispose objects before losing scope")]
public class MediaNamingTransactionPhaseSonarrTest
{
    [Test, AutoMockData]
    public void Sonarr_left_null(
        MediaNamingTransactionPhase sut)
    {
        var context = new MediaNamingPipelineContext
        {
            ApiFetchOutput = new SonarrMediaNamingDto(),
            ConfigOutput = new ProcessedNamingConfig
            {
                Dto = new SonarrMediaNamingDto
                {
                    RenameEpisodes = true,
                    SeasonFolderFormat = "season_default",
                    SeriesFolderFormat = "series_plex",
                    StandardEpisodeFormat = "episodes_standard_default_3",
                    DailyEpisodeFormat = "episodes_daily_default_3",
                    AnimeEpisodeFormat = "episodes_anime_default_3"
                }
            }
        };

        sut.Execute(context);

        context.TransactionOutput.Should().BeEquivalentTo(context.ConfigOutput.Dto, o => o.RespectingRuntimeTypes());
    }

    [Test, AutoMockData]
    public void Sonarr_right_null(
        MediaNamingTransactionPhase sut)
    {
        var context = new MediaNamingPipelineContext
        {
            ApiFetchOutput = new SonarrMediaNamingDto
            {
                RenameEpisodes = true,
                SeasonFolderFormat = "season_default",
                SeriesFolderFormat = "series_plex",
                StandardEpisodeFormat = "episodes_standard_default_3",
                DailyEpisodeFormat = "episodes_daily_default_3",
                AnimeEpisodeFormat = "episodes_anime_default_3"
            },
            ConfigOutput = new ProcessedNamingConfig
            {
                Dto = new SonarrMediaNamingDto()
            }
        };

        sut.Execute(context);

        context.TransactionOutput.Should().BeEquivalentTo(context.ApiFetchOutput, o => o.RespectingRuntimeTypes());
    }

    [Test, AutoMockData]
    public void Sonarr_right_and_left_with_rename(
        MediaNamingTransactionPhase sut)
    {
        var context = new MediaNamingPipelineContext
        {
            ApiFetchOutput = new SonarrMediaNamingDto
            {
                RenameEpisodes = false,
                SeasonFolderFormat = "season_default",
                SeriesFolderFormat = "series_plex",
                StandardEpisodeFormat = "episodes_standard_default",
                DailyEpisodeFormat = "episodes_daily_default",
                AnimeEpisodeFormat = "episodes_anime_default"
            },
            ConfigOutput = new ProcessedNamingConfig
            {
                Dto = new SonarrMediaNamingDto
                {
                    RenameEpisodes = true,
                    SeasonFolderFormat = "season_default2",
                    SeriesFolderFormat = "series_plex2",
                    StandardEpisodeFormat = "episodes_standard_default2",
                    DailyEpisodeFormat = "episodes_daily_default2",
                    AnimeEpisodeFormat = "episodes_anime_default2"
                }
            }
        };

        sut.Execute(context);

        context.TransactionOutput.Should().BeEquivalentTo(context.ConfigOutput.Dto, o => o.RespectingRuntimeTypes());
    }

    [Test, AutoMockData]
    public void Sonarr_right_and_left_without_rename(
        MediaNamingTransactionPhase sut)
    {
        var context = new MediaNamingPipelineContext
        {
            ApiFetchOutput = new SonarrMediaNamingDto
            {
                RenameEpisodes = true,
                SeasonFolderFormat = "season_default",
                SeriesFolderFormat = "series_plex",
                StandardEpisodeFormat = "episodes_standard_default",
                DailyEpisodeFormat = "episodes_daily_default",
                AnimeEpisodeFormat = "episodes_anime_default"
            },
            ConfigOutput = new ProcessedNamingConfig
            {
                Dto = new SonarrMediaNamingDto
                {
                    RenameEpisodes = false,
                    SeasonFolderFormat = "season_default2",
                    SeriesFolderFormat = "series_plex2",
                    StandardEpisodeFormat = "episodes_standard_default2",
                    DailyEpisodeFormat = "episodes_daily_default2",
                    AnimeEpisodeFormat = "episodes_anime_default2"
                }
            }
        };

        sut.Execute(context);

        context.TransactionOutput.Should().BeEquivalentTo(new SonarrMediaNamingDto
            {
                RenameEpisodes = false,
                SeasonFolderFormat = "season_default2",
                SeriesFolderFormat = "series_plex2",
                StandardEpisodeFormat = "episodes_standard_default2",
                DailyEpisodeFormat = "episodes_daily_default2",
                AnimeEpisodeFormat = "episodes_anime_default2"
            },
            o => o.RespectingRuntimeTypes());
    }
}