﻿using OfficeOpenXml.FormulaParsing.Excel.Functions;
using OfficeOpenXml.FormulaParsing.ExpressionGraph;
using OfficeOpenXml.FormulaParsing.LexicalAnalysis;
using OfficeOpenXml.FormulaParsing.Logging;
using OfficeOpenXml.FormulaParsing.Utilities;

namespace OfficeOpenXml.FormulaParsing;

public class ParsingConfiguration {
  public virtual ILexer Lexer { get; private set; }

  public IFormulaParserLogger Logger { get; private set; }

  public IExpressionGraphBuilder GraphBuilder { get; private set; }

  public IExpressionCompiler ExpressionCompiler { get; private set; }

  public FunctionRepository FunctionRepository { get; private set; } = FunctionRepository.Create();

  private ParsingConfiguration() {}

  internal static ParsingConfiguration Create() {
    return new();
  }

  public ParsingConfiguration SetLexer(ILexer lexer) {
    Lexer = lexer;
    return this;
  }

  public ParsingConfiguration SetGraphBuilder(IExpressionGraphBuilder graphBuilder) {
    GraphBuilder = graphBuilder;
    return this;
  }

  public ParsingConfiguration SetExpresionCompiler(IExpressionCompiler expressionCompiler) {
    ExpressionCompiler = expressionCompiler;
    return this;
  }

  /// <summary>
  /// Attaches a logger, errors and log entries will be written to the logger during the parsing process.
  /// </summary>
  /// <param name="logger"></param>
  /// <returns></returns>
  public ParsingConfiguration AttachLogger(IFormulaParserLogger logger) {
    Require.That(logger).Named("logger").IsNotNull();
    Logger = logger;
    return this;
  }

  /// <summary>
  /// if a logger is attached it will be removed.
  /// </summary>
  /// <returns></returns>
  public ParsingConfiguration DetachLogger() {
    Logger = null;
    return this;
  }
}
