﻿/* Copyright (C) 2011  Jan Källman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.

 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU Lesser General Public License for more details.
 *
 * The GNU Lesser General Public License can be viewed at http://www.opensource.org/licenses/lgpl-license.php
 * If you unfamiliar with this license or have questions about it, here is an http://www.gnu.org/licenses/gpl-faq.html
 *
 * All code and executables are provided "as is" with no warranty either express or implied.
 * The author accepts no liability for any damage or loss of business that this product may cause.
 *
 * Code change notes:
 *
 * Author							Change						Date
 *******************************************************************************
 * Mats Alm   		                Added		                2013-12-03
 *******************************************************************************/


namespace AppsheetEpplus;

public class ExcelLookupNavigator : LookupNavigator {
  private int _currentRow;
  private int _currentCol;
  private object _currentValue;
  private RangeAddress _rangeAddress;
  private int _index;

  public ExcelLookupNavigator(
      LookupDirection direction,
      LookupArguments arguments,
      ParsingContext parsingContext)
      : base(direction, arguments, parsingContext) {
    Initialize();
  }

  private void Initialize() {
    _index = 0;
    var factory = new RangeAddressFactory(ParsingContext.ExcelDataProvider);
    if (Arguments.RangeInfo == null) {
      _rangeAddress = factory.Create(
          ParsingContext.Scopes.Current.Address.Worksheet,
          Arguments.RangeAddress);
    } else {
      _rangeAddress = factory.Create(
          Arguments.RangeInfo.Address.WorkSheet,
          Arguments.RangeInfo.Address.Address);
    }
    _currentCol = _rangeAddress.FromCol;
    _currentRow = _rangeAddress.FromRow;
    SetCurrentValue();
  }

  private void SetCurrentValue() {
    _currentValue = ParsingContext.ExcelDataProvider.GetCellValue(
        _rangeAddress.Worksheet,
        _currentRow,
        _currentCol);
  }

  private bool HasNext() {
    if (Direction == LookupDirection.Vertical) {
      return _currentRow < _rangeAddress.ToRow;
    }
    return _currentCol < _rangeAddress.ToCol;
  }

  public override int Index => _index;

  public override bool MoveNext() {
    if (!HasNext()) {
      return false;
    }
    if (Direction == LookupDirection.Vertical) {
      _currentRow++;
    } else {
      _currentCol++;
    }
    _index++;
    SetCurrentValue();
    return true;
  }

  public override object CurrentValue => _currentValue;

  public override object GetLookupValue() {
    var row = _currentRow;
    var col = _currentCol;
    if (Direction == LookupDirection.Vertical) {
      col += Arguments.LookupIndex - 1;
      row += Arguments.LookupOffset;
    } else {
      row += Arguments.LookupIndex - 1;
      col += Arguments.LookupOffset;
    }
    return ParsingContext.ExcelDataProvider.GetCellValue(_rangeAddress.Worksheet, row, col);
  }
}
