/*******************************************************************************
 * 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 System;

namespace AppsheetEpplus;

internal class RangeConditionalFormatting : IRangeConditionalFormatting {
  public ExcelWorksheet _worksheet;
  public ExcelAddress _address;

  public RangeConditionalFormatting(ExcelWorksheet worksheet, ExcelAddress address) {
    ArgumentNullException.ThrowIfNull(worksheet);
    ArgumentNullException.ThrowIfNull(address);

    _worksheet = worksheet;
    _address = address;
  }

  /// <summary>
  /// Add AboveOrEqualAverage Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingAverageGroup AddAboveAverage() {
    return _worksheet.ConditionalFormatting.AddAboveAverage(_address);
  }

  /// <summary>
  /// Add AboveOrEqualAverage Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingAverageGroup AddAboveOrEqualAverage() {
    return _worksheet.ConditionalFormatting.AddAboveOrEqualAverage(_address);
  }

  /// <summary>
  /// Add BelowOrEqualAverage Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingAverageGroup AddBelowAverage() {
    return _worksheet.ConditionalFormatting.AddBelowAverage(_address);
  }

  /// <summary>
  /// Add BelowOrEqualAverage Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingAverageGroup AddBelowOrEqualAverage() {
    return _worksheet.ConditionalFormatting.AddBelowOrEqualAverage(_address);
  }

  /// <summary>
  /// Add AboveStdDev Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingStdDevGroup AddAboveStdDev() {
    return _worksheet.ConditionalFormatting.AddAboveStdDev(_address);
  }

  /// <summary>
  /// Add BelowStdDev Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingStdDevGroup AddBelowStdDev() {
    return _worksheet.ConditionalFormatting.AddBelowStdDev(_address);
  }

  /// <summary>
  /// Add Bottom Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTopBottomGroup AddBottom() {
    return _worksheet.ConditionalFormatting.AddBottom(_address);
  }

  /// <summary>
  /// Add BottomPercent Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTopBottomGroup AddBottomPercent() {
    return _worksheet.ConditionalFormatting.AddBottomPercent(_address);
  }

  /// <summary>
  /// Add Top Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTopBottomGroup AddTop() {
    return _worksheet.ConditionalFormatting.AddTop(_address);
  }

  /// <summary>
  /// Add TopPercent Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTopBottomGroup AddTopPercent() {
    return _worksheet.ConditionalFormatting.AddTopPercent(_address);
  }

  /// <summary>
  /// Add Last7Days Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddLast7Days() {
    return _worksheet.ConditionalFormatting.AddLast7Days(_address);
  }

  /// <summary>
  /// Add LastMonth Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddLastMonth() {
    return _worksheet.ConditionalFormatting.AddLastMonth(_address);
  }

  /// <summary>
  /// Add LastWeek Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddLastWeek() {
    return _worksheet.ConditionalFormatting.AddLastWeek(_address);
  }

  /// <summary>
  /// Add NextMonth Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddNextMonth() {
    return _worksheet.ConditionalFormatting.AddNextMonth(_address);
  }

  /// <summary>
  /// Add NextWeek Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddNextWeek() {
    return _worksheet.ConditionalFormatting.AddNextWeek(_address);
  }

  /// <summary>
  /// Add ThisMonth Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddThisMonth() {
    return _worksheet.ConditionalFormatting.AddThisMonth(_address);
  }

  /// <summary>
  /// Add ThisWeek Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddThisWeek() {
    return _worksheet.ConditionalFormatting.AddThisWeek(_address);
  }

  /// <summary>
  /// Add Today Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddToday() {
    return _worksheet.ConditionalFormatting.AddToday(_address);
  }

  /// <summary>
  /// Add Tomorrow Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddTomorrow() {
    return _worksheet.ConditionalFormatting.AddTomorrow(_address);
  }

  /// <summary>
  /// Add Yesterday Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTimePeriodGroup AddYesterday() {
    return _worksheet.ConditionalFormatting.AddYesterday(_address);
  }

  /// <summary>
  /// Add BeginsWith Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingBeginsWith AddBeginsWith() {
    return _worksheet.ConditionalFormatting.AddBeginsWith(_address);
  }

  /// <summary>
  /// Add Between Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingBetween AddBetween() {
    return _worksheet.ConditionalFormatting.AddBetween(_address);
  }

  /// <summary>
  /// Add ContainsBlanks Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingContainsBlanks AddContainsBlanks() {
    return _worksheet.ConditionalFormatting.AddContainsBlanks(_address);
  }

  /// <summary>
  /// Add ContainsErrors Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingContainsErrors AddContainsErrors() {
    return _worksheet.ConditionalFormatting.AddContainsErrors(_address);
  }

  /// <summary>
  /// Add ContainsText Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingContainsText AddContainsText() {
    return _worksheet.ConditionalFormatting.AddContainsText(_address);
  }

  /// <summary>
  /// Add DuplicateValues Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingDuplicateValues AddDuplicateValues() {
    return _worksheet.ConditionalFormatting.AddDuplicateValues(_address);
  }

  /// <summary>
  /// Add EndsWith Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingEndsWith AddEndsWith() {
    return _worksheet.ConditionalFormatting.AddEndsWith(_address);
  }

  /// <summary>
  /// Add Equal Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingEqual AddEqual() {
    return _worksheet.ConditionalFormatting.AddEqual(_address);
  }

  /// <summary>
  /// Add Expression Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingExpression AddExpression() {
    return _worksheet.ConditionalFormatting.AddExpression(_address);
  }

  /// <summary>
  /// Add GreaterThan Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingGreaterThan AddGreaterThan() {
    return _worksheet.ConditionalFormatting.AddGreaterThan(_address);
  }

  /// <summary>
  /// Add GreaterThanOrEqual Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingGreaterThanOrEqual AddGreaterThanOrEqual() {
    return _worksheet.ConditionalFormatting.AddGreaterThanOrEqual(_address);
  }

  /// <summary>
  /// Add LessThan Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingLessThan AddLessThan() {
    return _worksheet.ConditionalFormatting.AddLessThan(_address);
  }

  /// <summary>
  /// Add LessThanOrEqual Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingLessThanOrEqual AddLessThanOrEqual() {
    return _worksheet.ConditionalFormatting.AddLessThanOrEqual(_address);
  }

  /// <summary>
  /// Add NotBetween Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingNotBetween AddNotBetween() {
    return _worksheet.ConditionalFormatting.AddNotBetween(_address);
  }

  /// <summary>
  /// Add NotContainsBlanks Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingNotContainsBlanks AddNotContainsBlanks() {
    return _worksheet.ConditionalFormatting.AddNotContainsBlanks(_address);
  }

  /// <summary>
  /// Add NotContainsErrors Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingNotContainsErrors AddNotContainsErrors() {
    return _worksheet.ConditionalFormatting.AddNotContainsErrors(_address);
  }

  /// <summary>
  /// Add NotContainsText Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingNotContainsText AddNotContainsText() {
    return _worksheet.ConditionalFormatting.AddNotContainsText(_address);
  }

  /// <summary>
  /// Add NotEqual Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingNotEqual AddNotEqual() {
    return _worksheet.ConditionalFormatting.AddNotEqual(_address);
  }

  /// <summary>
  /// Add UniqueValues Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingUniqueValues AddUniqueValues() {
    return _worksheet.ConditionalFormatting.AddUniqueValues(_address);
  }

  /// <summary>
  /// Add ThreeColorScale Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingThreeColorScale AddThreeColorScale() {
    return (IExcelConditionalFormattingThreeColorScale)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.ThreeColorScale,
        _address));
  }

  /// <summary>
  /// Add TwoColorScale Conditional Formatting
  /// </summary>
  ///  <returns></returns>
  public IExcelConditionalFormattingTwoColorScale AddTwoColorScale() {
    return (IExcelConditionalFormattingTwoColorScale)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.TwoColorScale,
        _address));
  }
}
