using System;
using OfficeOpenXml.FormulaParsing.ExcelUtilities;

namespace OfficeOpenXml.FormulaParsing;

/// <summary>
/// Represents a parsing of a single input or workbook addrses.
/// </summary>
public class ParsingScope : IDisposable {
  private readonly ParsingScopes _parsingScopes;

  public ParsingScope(ParsingScopes parsingScopes, RangeAddress address)
      : this(parsingScopes, null, address) {}

  public ParsingScope(ParsingScopes parsingScopes, ParsingScope parent, RangeAddress address) {
    _parsingScopes = parsingScopes;
    Parent = parent;
    Address = address;
    ScopeId = Guid.NewGuid();
  }

  /// <summary>
  /// Id of the scope.
  /// </summary>
  public Guid ScopeId { get; private set; }

  /// <summary>
  /// The calling scope.
  /// </summary>
  public ParsingScope Parent { get; private set; }

  /// <summary>
  /// The address of the cell currently beeing parsed.
  /// </summary>
  public RangeAddress Address { get; private set; }

  /// <summary>
  /// True if the current scope is a Subtotal function beeing executed.
  /// </summary>
  public bool IsSubtotal { get; set; }

  public void Dispose() {
    _parsingScopes.KillScope(this);
  }
}
