using System;
using System.Collections.Generic;

namespace ClosedXML.Excel
{
    public interface IXLRows: IEnumerable<IXLRow>, IDisposable
    {
        /// <summary>
        /// Sets the height of all rows.
        /// </summary>
        /// <value>
        /// The height of all rows.
        /// </value>
        Double Height { set; }

        /// <summary>
        /// Deletes all rows and shifts the rows below them accordingly.
        /// </summary>
        void Delete();

        /// <summary>
        /// Adjusts the height of all rows based on its contents.
        /// </summary>
        IXLRows AdjustToContents();
        /// <summary>
        /// Adjusts the height of all rows based on its contents, starting from the startColumn.
        /// </summary>
        /// <param name="startColumn">The column to start calculating the row height.</param>
        IXLRows AdjustToContents(Int32 startColumn);
        /// <summary>
        /// Adjusts the height of all rows 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>
        IXLRows AdjustToContents(Int32 startColumn, Int32 endColumn);

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

        /// <summary>
        /// Hides all rows.
        /// </summary>
        void Hide();

        /// <summary>Unhides all rows.</summary>
        void Unhide();

        /// <summary>
        /// Increments the outline level of all rows by 1.
        /// </summary>
        void Group();

        /// <summary>
        /// Increments the outline level of all rows by 1.
        /// </summary>
        /// <param name="collapse">If set to <c>true</c> the rows will be shown collapsed.</param>
        void Group(Boolean collapse);

        /// <summary>
        /// Sets outline level for all rows.
        /// </summary>
        /// <param name="outlineLevel">The outline level.</param>
        void Group(Int32 outlineLevel);

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

        /// <summary>
        /// Decrements the outline level of all rows by 1.
        /// </summary>
        void Ungroup();

        /// <summary>
        /// Decrements the outline level of all rows by 1.
        /// </summary>
        /// <param name="fromAll">If set to <c>true</c> it will remove the rows from all outline levels.</param>
        void Ungroup(Boolean fromAll);

        /// <summary>
        /// Show all rows as collapsed.
        /// </summary>
        void Collapse();

        /// <summary>Expands all rows (if they're collapsed).</summary>
        void Expand();

        /// <summary>
        /// Returns the collection of cells.
        /// </summary>
        IXLCells Cells();
        
        /// <summary>
        /// Returns the collection of cells that have a value.
        /// </summary>
        IXLCells CellsUsed();

        /// <summary>
        /// Returns the collection of cells that have a value.
        /// </summary>
        /// <param name="includeFormats">if set to <c>true</c> will return all cells with a value or a style different than the default.</param>
        IXLCells CellsUsed(Boolean includeFormats);

        IXLStyle Style { get; set; }

        /// <summary>
        /// Adds a horizontal page break after these rows.
        /// </summary>
        IXLRows AddHorizontalPageBreaks();

        IXLRows SetDataType(XLCellValues dataType);

        /// <summary>
        /// Clears the contents of these rows.
        /// </summary>
        /// <param name="clearOptions">Specify what you want to clear.</param>
        IXLRows Clear(XLClearOptions clearOptions = XLClearOptions.ContentsAndFormats);

        void Select();
    }
}
