﻿/*
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

namespace DotPulsar.StressTests;

using Abstractions;
using Internal;
using System;
using System.Threading.Tasks;
using Xunit.Abstractions;

internal class XunitExceptionHandler : IHandleException
{
    private readonly ITestOutputHelper _output;
    private readonly IHandleException _exceptionHandler;

    public XunitExceptionHandler(ITestOutputHelper output, IHandleException exceptionHandler)
    {
        _output = output;
        _exceptionHandler = exceptionHandler;
    }

    public XunitExceptionHandler(ITestOutputHelper output) : this(output, new DefaultExceptionHandler(TimeSpan.FromSeconds(3))) { }

    public async ValueTask OnException(ExceptionContext exceptionContext)
    {
        await _exceptionHandler.OnException(exceptionContext).ConfigureAwait(false);

        if (!exceptionContext.ExceptionHandled)
            _output.WriteLine(
                $"{exceptionContext.Exception.GetType().Name} " +
                $"{exceptionContext.Exception.Message}{Environment.NewLine}" +
                $"{exceptionContext.Exception.StackTrace}");
    }
}
