﻿using OfficeOpenXml.FormulaParsing.ExcelUtilities;
using OfficeOpenXml.FormulaParsing.Logging;

namespace OfficeOpenXml.FormulaParsing;

/// <summary>
/// Parsing context
/// </summary>
public class ParsingContext : IParsingLifetimeEventHandler {
  private ParsingContext() {}

  /// <summary>
  /// The <see cref="FormulaParser"/> of the current context.
  /// </summary>
  public FormulaParser Parser { get; set; }

  /// <summary>
  /// The <see cref="ExcelDataProvider"/> is an abstraction on top of
  /// Excel, in this case EPPlus.
  /// </summary>
  public ExcelDataProvider ExcelDataProvider { get; set; }

  /// <summary>
  /// Utility for handling addresses
  /// </summary>
  public RangeAddressFactory RangeAddressFactory { get; set; }

  /// <summary>
  /// <see cref="INameValueProvider"/> of the current context
  /// </summary>
  public INameValueProvider NameValueProvider { get; set; }

  /// <summary>
  /// Configuration
  /// </summary>
  public ParsingConfiguration Configuration { get; set; }

  /// <summary>
  /// Scopes, a scope represents the parsing of a cell or a value.
  /// </summary>
  public ParsingScopes Scopes { get; private set; }

  /// <summary>
  /// Returns true if a <see cref="IFormulaParserLogger"/> is attached to the parser.
  /// </summary>
  public bool Debug => Configuration.Logger != null;

  /// <summary>
  /// Factory method.
  /// </summary>
  /// <returns></returns>
  public static ParsingContext Create() {
    var context = new ParsingContext();
    context.Configuration = ParsingConfiguration.Create();
    context.Scopes = new(context);
    return context;
  }

  void IParsingLifetimeEventHandler.ParsingCompleted() {}
}
