// ReSharper disable UnusedParameter.Local
// ReSharper disable UnusedMember.Local

public class Snippets
{
    async Task ChangeDefaultsPerVerification(object target)
    {
        #region ChangeDefaultsPerVerification

        var settings = new VerifySettings();
        settings.DontIgnoreEmptyCollections();
        settings.DontScrubGuids();
        settings.DontScrubDateTimes();
        await Verify(target, settings);

        #endregion

        #region ChangeDefaultsPerVerification

        await Verify(target)
            .DontIgnoreEmptyCollections()
            .DontScrubGuids()
            .DontScrubDateTimes();

        #endregion
    }

    void TreatAsString() =>
    #region TreatAsString
        VerifierSettings.TreatAsString<ClassWithToString>(
            (target, settings) => target.Property);
    #endregion

    record ClassWithToString(string Property);

    void DerivePathInfoAppVeyor()
    {
        // ReSharper disable once ArrangeStaticMemberQualifier

        #region DerivePathInfoAppVeyor

        if (BuildServerDetector.Detected)
        {
            var buildDirectory = Environment.GetEnvironmentVariable("APPVEYOR_BUILD_FOLDER")!;
            DerivePathInfo(
                (sourceFile, projectDirectory, typeName, methodName) =>
                {
                    var testDirectory = Path.GetDirectoryName(sourceFile)!;
                    var testDirectorySuffix = testDirectory.Replace(projectDirectory, string.Empty);
                    return new(directory: Path.Combine(buildDirectory, testDirectorySuffix));
                });
        }

        #endregion
    }

    void AutoVerify()
    {
        #region AutoVerify

        var settings = new VerifySettings();
        settings.AutoVerify();

        #endregion
    }

    void AutoVerifyDelegate()
    {
        #region AutoVerifyDelegate

        var settings = new VerifySettings();
        settings.AutoVerify(
            verifiedFile =>
                Path.GetExtension(verifiedFile) == "png");

        #endregion
    }

    #region AutoVerifyFluent

    [Fact]
    public Task AutoVerifyFluent() =>
        Verify("Value")
            .AutoVerify();

    #endregion

    public Task OverrideTreatAsStringDefaults()
    {
    #region OverrideTreatAsStringDefaults
        VerifierSettings.TreatAsString<DateTime>(
            (target, settings) => target.ToString("D"));
        #endregion
        return Verify(DateTime.Now);
    }

    #region AutoVerifyFluentDelegate

    [Fact]
    public Task AutoVerifyFluentDelegate() =>
        Verify("Value")
            .AutoVerify(
                verifiedFile =>
                    Path.GetExtension(verifiedFile) == "png");

    #endregion

    void DisableDiff()
    {
        #region DisableDiff

        var settings = new VerifySettings();
        settings.DisableDiff();

        #endregion
    }

    void ApplyExtraSettingsSample()
    {
        #region ExtraSettingsGlobal

        VerifierSettings.AddExtraSettings(
            _ => _.TypeNameHandling = TypeNameHandling.All);

        #endregion

        #region ExtraSettingsInstance

        var settings = new VerifySettings();
        settings.AddExtraSettings(
            _ => _.TypeNameHandling = TypeNameHandling.All);

        #endregion
    }

    void Converter() =>
    #region JsonConverter
        VerifierSettings.AddExtraSettings(
            _ => _.Converters.Add(new CompanyConverter()));
    #endregion


    #region CompanyConverter

    class CompanyConverter :
        WriteOnlyJsonConverter<Company>
    {
        public override void Write(VerifyJsonWriter writer, Company company) =>
            writer.WriteMember(company, company.Name, "Name");
    }

    #endregion

    record Company(string Name);

    async Task VerifyFuncOfTaskOfT()
    {
        var repo = new Repo();
        var id = 1;

        #region VerifyFuncOfTaskOfT

        await Verify(
            async () => new
            {
                Foo = await repo.GetFoo(id),
                Bars = await repo.GetBars(id)
            });

        #endregion
    }

    class Repo
    {
        // ReSharper disable once MemberCanBeMadeStatic.Local
        public Task<object> GetFoo(int id) => throw new NotImplementedException();

        // ReSharper disable once MemberCanBeMadeStatic.Local
        public Task<object> GetBars(int id) => throw new NotImplementedException();
    }
}