/*******************************************************************************
 * 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.Xml;
using OfficeOpenXml.Utils;

namespace OfficeOpenXml.ConditionalFormatting;

/// <summary>
/// Factory class for ExcelConditionalFormatting.
/// </summary>
internal static class ExcelConditionalFormattingRuleFactory {
  public static ExcelConditionalFormattingRule Create(
      eExcelConditionalFormattingRuleType type,
      ExcelAddress address,
      int priority,
      ExcelWorksheet worksheet,
      XmlNode itemElementNode) {
    Require.Argument(type);
    Require.Argument(address).IsNotNull("address");
    Require.Argument(priority).IsInRange(1, int.MaxValue, "priority");
    Require.Argument(worksheet).IsNotNull("worksheet");

    // According the conditional formatting rule type
    switch (type) {
      case eExcelConditionalFormattingRuleType.AboveAverage:
        return new ExcelConditionalFormattingAboveAverage(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.AboveOrEqualAverage:
        return new ExcelConditionalFormattingAboveOrEqualAverage(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.BelowAverage:
        return new ExcelConditionalFormattingBelowAverage(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.BelowOrEqualAverage:
        return new ExcelConditionalFormattingBelowOrEqualAverage(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.AboveStdDev:
        return new ExcelConditionalFormattingAboveStdDev(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.BelowStdDev:
        return new ExcelConditionalFormattingBelowStdDev(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Bottom:
        return new ExcelConditionalFormattingBottom(address, priority, worksheet, itemElementNode);

      case eExcelConditionalFormattingRuleType.BottomPercent:
        return new ExcelConditionalFormattingBottomPercent(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Top:
        return new ExcelConditionalFormattingTop(address, priority, worksheet, itemElementNode);

      case eExcelConditionalFormattingRuleType.TopPercent:
        return new ExcelConditionalFormattingTopPercent(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Last7Days:
        return new ExcelConditionalFormattingLast7Days(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.LastMonth:
        return new ExcelConditionalFormattingLastMonth(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.LastWeek:
        return new ExcelConditionalFormattingLastWeek(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NextMonth:
        return new ExcelConditionalFormattingNextMonth(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NextWeek:
        return new ExcelConditionalFormattingNextWeek(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.ThisMonth:
        return new ExcelConditionalFormattingThisMonth(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.ThisWeek:
        return new ExcelConditionalFormattingThisWeek(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Today:
        return new ExcelConditionalFormattingToday(address, priority, worksheet, itemElementNode);

      case eExcelConditionalFormattingRuleType.Tomorrow:
        return new ExcelConditionalFormattingTomorrow(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Yesterday:
        return new ExcelConditionalFormattingYesterday(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.BeginsWith:
        return new ExcelConditionalFormattingBeginsWith(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Between:
        return new ExcelConditionalFormattingBetween(address, priority, worksheet, itemElementNode);

      case eExcelConditionalFormattingRuleType.ContainsBlanks:
        return new ExcelConditionalFormattingContainsBlanks(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.ContainsErrors:
        return new ExcelConditionalFormattingContainsErrors(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.ContainsText:
        return new ExcelConditionalFormattingContainsText(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.DuplicateValues:
        return new ExcelConditionalFormattingDuplicateValues(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.EndsWith:
        return new ExcelConditionalFormattingEndsWith(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.Equal:
        return new ExcelConditionalFormattingEqual(address, priority, worksheet, itemElementNode);

      case eExcelConditionalFormattingRuleType.Expression:
        return new ExcelConditionalFormattingExpression(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.GreaterThan:
        return new ExcelConditionalFormattingGreaterThan(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.GreaterThanOrEqual:
        return new ExcelConditionalFormattingGreaterThanOrEqual(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.LessThan:
        return new ExcelConditionalFormattingLessThan(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.LessThanOrEqual:
        return new ExcelConditionalFormattingLessThanOrEqual(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NotBetween:
        return new ExcelConditionalFormattingNotBetween(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NotContainsBlanks:
        return new ExcelConditionalFormattingNotContainsBlanks(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NotContainsErrors:
        return new ExcelConditionalFormattingNotContainsErrors(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NotContainsText:
        return new ExcelConditionalFormattingNotContainsText(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.NotEqual:
        return new ExcelConditionalFormattingNotEqual(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.UniqueValues:
        return new ExcelConditionalFormattingUniqueValues(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.ThreeColorScale:
        return new ExcelConditionalFormattingThreeColorScale(
            address,
            priority,
            worksheet,
            itemElementNode);

      case eExcelConditionalFormattingRuleType.TwoColorScale:
        return new ExcelConditionalFormattingTwoColorScale(
            address,
            priority,
            worksheet,
            itemElementNode);
      case eExcelConditionalFormattingRuleType.ThreeIconSet:
        return new ExcelConditionalFormattingThreeIconSet(
            address,
            priority,
            worksheet,
            itemElementNode,
            null);
      case eExcelConditionalFormattingRuleType.FourIconSet:
        return new ExcelConditionalFormattingFourIconSet(
            address,
            priority,
            worksheet,
            itemElementNode,
            null);
      case eExcelConditionalFormattingRuleType.FiveIconSet:
        return new ExcelConditionalFormattingFiveIconSet(
            address,
            priority,
            worksheet,
            itemElementNode,
            null);
      case eExcelConditionalFormattingRuleType.DataBar:
        return new ExcelConditionalFormattingDataBar(
            eExcelConditionalFormattingRuleType.DataBar,
            address,
            priority,
            worksheet,
            itemElementNode,
            null);

      //TODO: Add DataBar
    }

    throw new InvalidOperationException(
        string.Format(
            ExcelConditionalFormattingConstants.Errors._nonSupportedRuleType,
            type.ToString()));
  }
}
