/*******************************************************************************
 * 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.Drawing;
using OfficeOpenXml.ConditionalFormatting.Contracts;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml.ConditionalFormatting;

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

  public RangeConditionalFormatting(ExcelWorksheet worksheet, ExcelAddress address) {
    Require.Argument(worksheet).IsNotNull("worksheet");
    Require.Argument(address).IsNotNull("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));
  }

  /// <summary>
  /// Adds a ThreeIconSet rule
  /// </summary>
  /// <param name="iconSet"></param>
  /// <returns></returns>
  public IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType> AddThreeIconSet(
      eExcelconditionalFormatting3IconsSetType iconSet) {
    var rule =
        (IExcelConditionalFormattingThreeIconSet<eExcelconditionalFormatting3IconsSetType>)(_worksheet.ConditionalFormatting.AddRule(
            eExcelConditionalFormattingRuleType.ThreeIconSet,
            _address));
    rule.IconSet = iconSet;
    return rule;
  }

  /// <summary>
  /// Adds a FourIconSet rule
  /// </summary>
  /// <param name="iconSet"></param>
  /// <returns></returns>
  public IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType> AddFourIconSet(
      eExcelconditionalFormatting4IconsSetType iconSet) {
    var rule =
        (IExcelConditionalFormattingFourIconSet<eExcelconditionalFormatting4IconsSetType>)(_worksheet.ConditionalFormatting.AddRule(
            eExcelConditionalFormattingRuleType.FourIconSet,
            _address));
    rule.IconSet = iconSet;
    return rule;
  }

  /// <summary>
  /// Adds a FiveIconSet rule
  /// </summary>
  /// <param name="iconSet"></param>
  /// <returns></returns>
  public IExcelConditionalFormattingFiveIconSet AddFiveIconSet(
      eExcelconditionalFormatting5IconsSetType iconSet) {
    var rule = (IExcelConditionalFormattingFiveIconSet)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.FiveIconSet,
        _address));
    rule.IconSet = iconSet;
    return rule;
  }

  /// <summary>
  /// Adds a Databar rule
  /// </summary>
  /// <param name="color">The color of the databar</param>
  /// <returns></returns>
  public IExcelConditionalFormattingDataBarGroup AddDatabar(Color color) {
    var rule = (IExcelConditionalFormattingDataBarGroup)(_worksheet.ConditionalFormatting.AddRule(
        eExcelConditionalFormattingRuleType.DataBar,
        _address));
    rule.Color = color;
    return rule;
  }
}
