#region Apache License
//
// Licensed to the Apache Software Foundation (ASF) under one or more 
// contributor license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright ownership. 
// The ASF licenses this file to you 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.
//
#endregion

using System;
using System.IO;

using log4net.Core;
using log4net.Util;

namespace log4net.Layout.Pattern;

/// <summary>
/// Abstract class that provides the formatting functionality that 
/// derived classes need.
/// </summary>
/// <remarks>
/// Conversion specifiers in a conversion patterns are parsed to
/// individual PatternConverters. Each of which is responsible for
/// converting a logging event in a converter specific manner.
/// </remarks>
/// <author>Nicko Cadell</author>
public abstract class PatternLayoutConverter : PatternConverter
{
  /// <summary>
  /// Initializes a new instance of the <see cref="PatternLayoutConverter" /> class.
  /// </summary>
  protected PatternLayoutConverter()
  {
  }

  /// <summary>
  /// Flag indicating if this converter handles the logging event exception
  /// </summary>
  /// <value><see langword="false"/> if this converter handles the logging event exception</value>
  /// <remarks>
  /// <para>
  /// If this converter handles the exception object contained within
  /// <see cref="LoggingEvent"/>, then this property should be set to
  /// <see langword="false"/>. Otherwise, if the layout ignores the exception
  /// object, then the property should be set to <see langword="true"/>.
  /// </para>
  /// <para>
  /// Set this value to override a this default setting. The default
  /// value is <see langword="true"/>, this converter does not handle the exception.
  /// </para>
  /// </remarks>
  public virtual bool IgnoresException { get; set; } = true;

  /// <summary>
  /// Derived pattern converters must override this method in order to
  /// convert conversion specifiers in the correct way.
  /// </summary>
  /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
  /// <param name="loggingEvent">The <see cref="LoggingEvent" /> on which the pattern converter should be executed.</param>
  protected abstract void Convert(TextWriter writer, LoggingEvent loggingEvent);

  /// <summary>
  /// Derived pattern converters must override this method in order to
  /// convert conversion specifiers in the correct way.
  /// </summary>
  /// <param name="writer"><see cref="TextWriter" /> that will receive the formatted result.</param>
  /// <param name="state">The state object on which the pattern converter should be executed.</param>
  public override void Convert(TextWriter writer, object? state)
  {
    if (state is not LoggingEvent loggingEvent)
    {
      throw new ArgumentException($"state must be of type [{typeof(LoggingEvent).FullName}]", nameof(state));
    }

    Convert(writer, loggingEvent);
  }
}