/*******************************************************************************
 * You may amend and distribute as you like, but don't remove this header!
 *
 * EPPlus provides server-side generation of Excel 2007/2010 spreadsheets.
 * See http://www.codeplex.com/EPPlus for details.
 *
 * 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
 * ******************************************************************************
 * Jan Källman		    Initial Release		        2009-10-01
 * Jan Källman		    License changed GPL-->LGPL 2011-12-27
 *******************************************************************************/

using System;

namespace AppsheetEpplus;

/// <summary>
/// A range of cells.
/// </summary>
public class ExcelRange : ExcelRangeBase {
  internal ExcelRange(ExcelWorksheet sheet, string address)
      : base(sheet, address) {}

  internal ExcelRange(ExcelWorksheet sheet, int fromRow, int fromCol, int toRow, int toCol)
      : base(sheet) {
    _fromRow = fromRow;
    _fromCol = fromCol;
    _toRow = toRow;
    _toCol = toCol;
  }

  /// <summary>
  /// Access the range using an address
  /// </summary>
  /// <param name="address">The address</param>
  /// <returns>A range object</returns>
  public ExcelRange this[string address] {
    get {
      if (_worksheet.Names.ContainsKey(address)) {
        if (_worksheet.Names[address].IsName) {
          return null;
        }
        Address = _worksheet.Names[address].Address;
      } else {
        Address = address;
      }
      return this;
    }
  }

  /// <summary>
  /// Access a single cell
  /// </summary>
  /// <param name="row">The row</param>
  /// <param name="col">The column</param>
  /// <returns>A range object</returns>
  public ExcelRange this[int row, int col] {
    get {
      ValidateRowCol(row, col);

      _fromCol = col;
      _fromRow = row;
      _toCol = col;
      _toRow = row;
      Address = GetAddress(_fromRow, _fromCol);
      return this;
    }
  }

  /// <summary>
  /// Access a range of cells
  /// </summary>
  /// <param name="fromRow">Start row</param>
  /// <param name="fromCol">Start column</param>
  /// <param name="toRow">End Row</param>
  /// <param name="toCol">End Column</param>
  /// <returns></returns>
  public ExcelRange this[int fromRow, int fromCol, int toRow, int toCol] {
    get {
      ValidateRowCol(fromRow, fromCol);
      ValidateRowCol(toRow, toCol);

      _fromCol = fromCol;
      _fromRow = fromRow;
      _toCol = toCol;
      _toRow = toRow;
      Address = GetAddress(_fromRow, _fromCol, _toRow, _toCol);
      return this;
    }
  }

  private static void ValidateRowCol(int row, int col) {
    if (row < 1 || row > ExcelPackage.MaxRows) {
      throw (new ArgumentException("Row out of range"));
    }
    if (col < 1 || col > ExcelPackage.MaxColumns) {
      throw (new ArgumentException("Column out of range"));
    }
  }
}
