/* 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
 *******************************************************************************
 * Mats Alm   		                Added		                2013-12-03
 *******************************************************************************/

using System;
using System.Collections.Frozen;
using System.Collections.Generic;

namespace EpplusFormulaParser;

internal static class FunctionRepository {
  private static readonly FrozenSet<string> _functions = new HashSet<string>(
      StringComparer.InvariantCultureIgnoreCase) {
    // Text
    "len",
    "lower",
    "upper",
    "left",
    "right",
    "mid",
    "replace",
    "rept",
    "substitute",
    "concatenate",
    "char",
    "exact",
    "find",
    "fixed",
    "proper",
    "text",
    "t",
    "hyperlink",
    // Numbers
    "int",
    // Math
    "abs",
    "asin",
    "asinh",
    "cos",
    "cosh",
    "power",
    "sign",
    "sqrt",
    "sqrtpi",
    "pi",
    "product",
    "ceiling",
    "count",
    "counta",
    "countblank",
    "countif",
    "countifs",
    "fact",
    "floor",
    "sin",
    "sinh",
    "sum",
    "sumif",
    "sumifs",
    "sumproduct",
    "sumsq",
    "stdev",
    "stdevp",
    "stdev.s",
    "stdev.p",
    "subtotal",
    "exp",
    "log",
    "log10",
    "ln",
    "max",
    "maxa",
    "median",
    "min",
    "mina",
    "mod",
    "average",
    "averagea",
    "averageif",
    "averageifs",
    "round",
    "rounddown",
    "roundup",
    "rand",
    "randbetween",
    "quotient",
    "trunc",
    "tan",
    "tanh",
    "atan",
    "atan2",
    "atanh",
    "acos",
    "acosh",
    "var",
    "varp",
    "large",
    "small",
    "degrees",
    // Information
    "isblank",
    "isnumber",
    "istext",
    "isnontext",
    "iserror",
    "iserr",
    "error.type",
    "iseven",
    "isodd",
    "islogical",
    "isna",
    "na",
    "n",
    // Logical
    "if",
    "iferror",
    "ifna",
    "not",
    "and",
    "or",
    "true",
    "false",
    // Reference and lookup
    "address",
    "hlookup",
    "vlookup",
    "lookup",
    "match",
    "row",
    "rows",
    "column",
    "columns",
    "choose",
    "index",
    "indirect",
    "offset",
    // Date
    "date",
    "today",
    "now",
    "day",
    "month",
    "year",
    "time",
    "hour",
    "minute",
    "second",
    "weeknum",
    "weekday",
    "days360",
    "yearfrac",
    "edate",
    "eomonth",
    "isoweeknum",
    "workday",
    // Database
    "dget",
    "dcount",
    "dcounta",
    "dmax",
    "dmin",
    "dsum",
    "daverage",
    "dvar",
    "dvarp",
  }.ToFrozenSet();

  public static bool IsFunctionName(string name) {
    return _functions.Contains(name);
  }
}
