using System;


namespace ClosedXML.Excel
{
    public interface IXLRangeColumn : IXLRangeBase
    {
        /// <summary>
        /// Gets the cell in the specified row.
        /// </summary>
        /// <param name="rowNumber">The cell's row.</param>
        IXLCell Cell(Int32 rowNumber);

        /// <summary>
        /// Returns the specified group of cells, separated by commas.
        /// <para>e.g. Cells("1"), Cells("1:5"), Cells("1:2,4:5")</para>
        /// </summary>
        /// <param name="cellsInColumn">The column cells to return.</param>
        new IXLCells Cells(String cellsInColumn);
        /// <summary>
        /// Returns the specified group of cells.
        /// </summary>
        /// <param name="firstRow">The first row in the group of cells to return.</param>
        /// <param name="lastRow">The last row in the group of cells to return.</param>
        IXLCells Cells(Int32 firstRow, Int32 lastRow);

        /// <summary>
        /// Inserts X number of columns to the right of this range.
        /// <para>All cells to the right of this range will be shifted X number of columns.</para>
        /// </summary>
        /// <param name="numberOfColumns">Number of columns to insert.</param>
        IXLRangeColumns InsertColumnsAfter(int numberOfColumns);
        IXLRangeColumns InsertColumnsAfter(int numberOfColumns, Boolean expandRange);
        /// <summary>
        /// Inserts X number of columns to the left of this range.
        /// <para>This range and all cells to the right of this range will be shifted X number of columns.</para>
        /// </summary>
        /// <param name="numberOfColumns">Number of columns to insert.</param>
        IXLRangeColumns InsertColumnsBefore(int numberOfColumns);
        IXLRangeColumns InsertColumnsBefore(int numberOfColumns, Boolean expandRange);
        /// <summary>
        /// Inserts X number of cells on top of this column.
        /// <para>This column and all cells below it will be shifted X number of rows.</para>
        /// </summary>
        /// <param name="numberOfRows">Number of cells to insert.</param>
        IXLCells InsertCellsAbove(int numberOfRows);
        IXLCells InsertCellsAbove(int numberOfRows, Boolean expandRange);
        /// <summary>
        /// Inserts X number of cells below this range.
        /// <para>All cells below this column will be shifted X number of rows.</para>
        /// </summary>
        /// <param name="numberOfRows">Number of cells to insert.</param>
        IXLCells InsertCellsBelow(int numberOfRows);
        IXLCells InsertCellsBelow(int numberOfRows, Boolean expandRange);

        /// <summary>
        /// Deletes this range and shifts the cells at the right.
        /// </summary>
        void Delete();
        /// <summary>
        /// Deletes this range and shifts the surrounding cells accordingly.
        /// </summary>
        /// <param name="shiftDeleteCells">How to shift the surrounding cells.</param>
        void Delete(XLShiftDeletedCells shiftDeleteCells);

        /// <summary>
        /// Gets this column's number in the range
        /// </summary>
        Int32 ColumnNumber();

        /// <summary>
        /// Gets this column's letter in the range
        /// </summary>
        String ColumnLetter();

        Int32 CellCount();

        IXLRangeColumn CopyTo(IXLCell target);
        IXLRangeColumn CopyTo(IXLRangeBase target);

        IXLRangeColumn Sort(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true);
        
        IXLRangeColumn Column(Int32 start, Int32 end);
        IXLRangeColumn Column(IXLCell start, IXLCell end);
        IXLRangeColumns Columns(String columns);

        IXLRangeColumn SetDataType(XLCellValues dataType);

        IXLRangeColumn ColumnLeft();
        IXLRangeColumn ColumnLeft(Int32 step);
        IXLRangeColumn ColumnRight();
        IXLRangeColumn ColumnRight(Int32 step);

        IXLColumn WorksheetColumn();

        IXLTable AsTable();
        IXLTable AsTable(String name);
        IXLTable CreateTable();
        IXLTable CreateTable(String name);

        /// <summary>
        /// Clears the contents of this column.
        /// </summary>
        /// <param name="clearOptions">Specify what you want to clear.</param>
        new IXLRangeColumn Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats);

        IXLRangeColumn ColumnUsed(Boolean includeFormats = false);
    }
}

