namespace AppsheetEpplus;

/// <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() {}
}
