using System;

namespace ClosedXML.Excel
{
    public interface IXLRow : IXLRangeBase
    {
        

        /// <summary>
        /// Gets or sets the height of this row.
        /// </summary>
        /// <value>
        /// The width of this row.
        /// </value>
        Double Height { get; set; }

        /// <summary>
        /// Deletes this row and shifts the rows below this one accordingly.
        /// </summary>
        void Delete();

        /// <summary>
        /// Gets this row's number
        /// </summary>
        Int32 RowNumber();

        /// <summary>
        /// Inserts X number of rows below this one.
        /// <para>All rows below will be shifted accordingly.</para>
        /// </summary>
        /// <param name="numberOfRows">The number of rows to insert.</param>
        IXLRows InsertRowsBelow(Int32 numberOfRows);

        /// <summary>
        /// Inserts X number of rows above this one.
        /// <para>This row and all below will be shifted accordingly.</para>
        /// </summary>
        /// <param name="numberOfRows">The number of rows to insert.</param>
        IXLRows InsertRowsAbove(Int32 numberOfRows);

        IXLRow AdjustToContents();

        /// <summary>
        /// Adjusts the height of the row based on its contents, starting from the startColumn.
        /// </summary>
        /// <param name="startColumn">The column to start calculating the row height.</param>
        IXLRow AdjustToContents(Int32 startColumn);
        /// <summary>
        /// Adjusts the height of the row based on its contents, starting from the startColumn and ending at endColumn.
        /// </summary>
        /// <param name="startColumn">The column to start calculating the row height.</param>
        /// <param name="endColumn">The column to end calculating the row height.</param>
        IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn);


        IXLRow AdjustToContents(Double minHeight, Double maxHeight);
        IXLRow AdjustToContents(Int32 startColumn, Double minHeight, Double maxHeight);
        IXLRow AdjustToContents(Int32 startColumn, Int32 endColumn, Double minHeight, Double maxHeight);

        /// <summary>Hides this row.</summary>
        IXLRow Hide();

        /// <summary>Unhides this row.</summary>
        IXLRow Unhide();

        /// <summary>
        /// Gets a value indicating whether this row is hidden or not.
        /// </summary>
        /// <value>
        ///   <c>true</c> if this row is hidden; otherwise, <c>false</c>.
        /// </value>
        Boolean IsHidden { get; }

        /// <summary>
        /// Gets or sets the outline level of this row.
        /// </summary>
        /// <value>
        /// The outline level of this row.
        /// </value>
        Int32 OutlineLevel { get; set; }

        /// <summary>
        /// Adds this row to the next outline level (Increments the outline level for this row by 1).
        /// </summary>
        IXLRow Group();

        /// <summary>
        /// Adds this row to the next outline level (Increments the outline level for this row by 1).
        /// </summary>
        /// <param name="collapse">If set to <c>true</c> the row will be shown collapsed.</param>
        IXLRow Group(Boolean collapse);

        /// <summary>
        /// Sets outline level for this row.
        /// </summary>
        /// <param name="outlineLevel">The outline level.</param>
        IXLRow Group(Int32 outlineLevel);

        /// <summary>
        /// Sets outline level for this row.
        /// </summary>
        /// <param name="outlineLevel">The outline level.</param>
        /// <param name="collapse">If set to <c>true</c> the row will be shown collapsed.</param>
        IXLRow Group(Int32 outlineLevel, Boolean collapse);

        /// <summary>
        /// Adds this row to the previous outline level (decrements the outline level for this row by 1).
        /// </summary>
        IXLRow Ungroup();


        /// <summary>
        /// Adds this row to the previous outline level (decrements the outline level for this row by 1).
        /// </summary>
        /// <param name="fromAll">If set to <c>true</c> it will remove this row from all outline levels.</param>
        IXLRow Ungroup(Boolean fromAll);

        /// <summary>
        /// Show this row as collapsed.
        /// </summary>
        IXLRow Collapse();

        /// <summary>
        /// Gets the cell in the specified column.
        /// </summary>
        /// <param name="columnNumber">The cell's column.</param>
        IXLCell Cell(Int32 columnNumber);

        /// <summary>
        /// Gets the cell in the specified column.
        /// </summary>
        /// <param name="columnLetter">The cell's column.</param>
        IXLCell Cell(String columnLetter);

        /// <summary>
        /// Returns the specified group of cells, separated by commas.
        /// <para>e.g. Cells("1"), Cells("1:5"), Cells("1,3:5")</para>
        /// </summary>
        /// <param name="cellsInRow">The row's cells to return.</param>
        new IXLCells Cells(String cellsInRow);
        /// <summary>
        /// Returns the specified group of cells.
        /// </summary>
        /// <param name="firstColumn">The first column in the group of cells to return.</param>
        /// <param name="lastColumn">The last column in the group of cells to return.</param>
        IXLCells Cells(Int32 firstColumn, Int32 lastColumn);
        /// <summary>
        /// Returns the specified group of cells.
        /// </summary>
        /// <param name="firstColumn">The first column in the group of cells to return.</param>
        /// <param name="lastColumn">The last column in the group of cells to return.</param>
        IXLCells Cells(String firstColumn, String lastColumn);

        /// <summary>Expands this row (if it's collapsed).</summary>
        IXLRow Expand();

        Int32 CellCount();

        IXLRangeRow CopyTo(IXLCell cell);
        IXLRangeRow CopyTo(IXLRangeBase range);
        IXLRow CopyTo(IXLRow row);

        IXLRow Sort();
        IXLRow SortLeftToRight(XLSortOrder sortOrder = XLSortOrder.Ascending, Boolean matchCase = false, Boolean ignoreBlanks = true);

        IXLRangeRow Row(Int32 start, Int32 end);
        IXLRangeRow Row(IXLCell start, IXLCell end);
        IXLRangeRows Rows(String columns);

        /// <summary>
        /// Adds a horizontal page break after this row.
        /// </summary>
        IXLRow AddHorizontalPageBreak();

        IXLRow SetDataType(XLCellValues dataType);

        IXLRow RowAbove();
        IXLRow RowAbove(Int32 step);
        IXLRow RowBelow();
        IXLRow RowBelow(Int32 step);

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

        IXLRangeRow RowUsed(Boolean includeFormats = false);
    }
}
