/*******************************************************************************
 * 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;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using OfficeOpenXml.Utils;
using OfficeOpenXml.ConditionalFormatting.Contracts;

namespace OfficeOpenXml.ConditionalFormatting
{
  internal class RangeConditionalFormatting
    : IRangeConditionalFormatting
  {
    #region Public Properties
    public ExcelWorksheet _worksheet;
    public ExcelAddress _address;
    #endregion Public Properties

    #region Constructors
    public RangeConditionalFormatting(
      ExcelWorksheet worksheet,
      ExcelAddress address)
    {
      Require.Argument(worksheet).IsNotNull("worksheet");
      Require.Argument(address).IsNotNull("address");

      _worksheet = worksheet;
      _address = address;
    }
    #endregion Constructors

    #region Conditional Formatting Rule Types
    /// <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(System.Drawing.Color Color)
    {
        var rule = (IExcelConditionalFormattingDataBarGroup)(_worksheet.ConditionalFormatting.AddRule(
          eExcelConditionalFormattingRuleType.DataBar,
          _address));
        rule.Color = Color;
        return rule;
    }
    #endregion Conditional Formatting Rule Types
  }
}