﻿/*******************************************************************************
 * 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
 * ******************************************************************************
 * Eyal Seagull		    Conditional Formatting    2012-04-03
 *******************************************************************************/

using OfficeOpenXml.ConditionalFormatting.Contracts;

namespace OfficeOpenXml.ConditionalFormatting;

/// <summary>
/// Provides functionality for adding Conditional Formatting to a range (<see cref="ExcelRangeBase"/>).
/// Each method will return a configurable condtional formatting type.
/// </summary>
public interface IRangeConditionalFormatting {
  /// <summary>
  /// Adds a Above Average rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingAverageGroup AddAboveAverage();

  /// <summary>
  /// Adds a Above Or Equal Average rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingAverageGroup AddAboveOrEqualAverage();

  /// <summary>
  /// Adds a Below Average rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingAverageGroup AddBelowAverage();

  /// <summary>
  /// Adds a Below Or Equal Average rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingAverageGroup AddBelowOrEqualAverage();

  /// <summary>
  /// Adds a Above StdDev rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingStdDevGroup AddAboveStdDev();

  /// <summary>
  /// Adds a Below StdDev rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingStdDevGroup AddBelowStdDev();

  /// <summary>
  /// Adds a Bottom rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTopBottomGroup AddBottom();

  /// <summary>
  /// Adds a Bottom Percent rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTopBottomGroup AddBottomPercent();

  /// <summary>
  /// Adds a Top rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTopBottomGroup AddTop();

  /// <summary>
  /// Adds a Top Percent rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTopBottomGroup AddTopPercent();

  /// <summary>
  /// Adds a Last 7 Days rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddLast7Days();

  /// <summary>
  /// Adds a Last Month rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddLastMonth();

  /// <summary>
  /// Adds a Last Week rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddLastWeek();

  /// <summary>
  /// Adds a Next Month rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddNextMonth();

  /// <summary>
  /// Adds a Next Week rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddNextWeek();

  /// <summary>
  /// Adds a This Month rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddThisMonth();

  /// <summary>
  /// Adds a This Week rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddThisWeek();

  /// <summary>
  /// Adds a Today rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddToday();

  /// <summary>
  /// Adds a Tomorrow rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddTomorrow();

  /// <summary>
  /// Adds a Yesterday rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTimePeriodGroup AddYesterday();

  /// <summary>
  /// Adds a Begins With rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingBeginsWith AddBeginsWith();

  /// <summary>
  /// Adds a Between rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingBetween AddBetween();

  /// <summary>
  /// Adds a ContainsBlanks rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingContainsBlanks AddContainsBlanks();

  /// <summary>
  /// Adds a ContainsErrors rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingContainsErrors AddContainsErrors();

  /// <summary>
  /// Adds a ContainsText rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingContainsText AddContainsText();

  /// <summary>
  /// Adds a DuplicateValues rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingDuplicateValues AddDuplicateValues();

  /// <summary>
  /// Adds a EndsWith rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingEndsWith AddEndsWith();

  /// <summary>
  /// Adds a Equal rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingEqual AddEqual();

  /// <summary>
  /// Adds a Expression rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingExpression AddExpression();

  /// <summary>
  /// Adds a GreaterThan rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingGreaterThan AddGreaterThan();

  /// <summary>
  /// Adds a GreaterThanOrEqual rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingGreaterThanOrEqual AddGreaterThanOrEqual();

  /// <summary>
  /// Adds a LessThan rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingLessThan AddLessThan();

  /// <summary>
  /// Adds a LessThanOrEqual rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingLessThanOrEqual AddLessThanOrEqual();

  /// <summary>
  /// Adds a NotBetween rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingNotBetween AddNotBetween();

  /// <summary>
  /// Adds a NotContainsBlanks rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingNotContainsBlanks AddNotContainsBlanks();

  /// <summary>
  /// Adds a NotContainsErrors rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingNotContainsErrors AddNotContainsErrors();

  /// <summary>
  /// Adds a NotContainsText rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingNotContainsText AddNotContainsText();

  /// <summary>
  /// Adds a NotEqual rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingNotEqual AddNotEqual();

  /// <summary>
  /// Adds a UniqueValues rule to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingUniqueValues AddUniqueValues();

  /// <summary>
  /// Adds a <see cref="ExcelConditionalFormattingThreeColorScale"/> to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingThreeColorScale AddThreeColorScale();

  /// <summary>
  /// Adds a <see cref="ExcelConditionalFormattingTwoColorScale"/> to the range
  /// </summary>
  /// <returns></returns>
  IExcelConditionalFormattingTwoColorScale AddTwoColorScale();
}
