/* 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 OfficeOpenXml.FormulaParsing.Excel.Functions.Database;
using OfficeOpenXml.FormulaParsing.Excel.Functions.DateTime;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Information;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Logical;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Math;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Numeric;
using OfficeOpenXml.FormulaParsing.Excel.Functions.RefAndLookup;
using OfficeOpenXml.FormulaParsing.Excel.Functions.Text;

namespace OfficeOpenXml.FormulaParsing.Excel.Functions;

public class BuiltInFunctions : FunctionsModule {
  public BuiltInFunctions() {
    // Text
    Functions["len"] = new Len();
    Functions["lower"] = new Lower();
    Functions["upper"] = new Upper();
    Functions["left"] = new Left();
    Functions["right"] = new Right();
    Functions["mid"] = new Mid();
    Functions["replace"] = new Replace();
    Functions["rept"] = new Rept();
    Functions["substitute"] = new Substitute();
    Functions["concatenate"] = new Concatenate();
    Functions["char"] = new CharFunction();
    Functions["exact"] = new Exact();
    Functions["find"] = new Find();
    Functions["fixed"] = new Fixed();
    Functions["proper"] = new Proper();
    Functions["text"] = new Text.Text();
    Functions["t"] = new T();
    Functions["hyperlink"] = new Hyperlink();
    // Numbers
    Functions["int"] = new CInt();
    // Math
    Functions["abs"] = new Abs();
    Functions["asin"] = new Asin();
    Functions["asinh"] = new Asinh();
    Functions["cos"] = new Cos();
    Functions["cosh"] = new Cosh();
    Functions["power"] = new Power();
    Functions["sign"] = new Sign();
    Functions["sqrt"] = new Sqrt();
    Functions["sqrtpi"] = new SqrtPi();
    Functions["pi"] = new Pi();
    Functions["product"] = new Product();
    Functions["ceiling"] = new Ceiling();
    Functions["count"] = new Count();
    Functions["counta"] = new CountA();
    Functions["countblank"] = new CountBlank();
    Functions["countif"] = new CountIf();
    Functions["countifs"] = new CountIfs();
    Functions["fact"] = new Fact();
    Functions["floor"] = new Floor();
    Functions["sin"] = new Sin();
    Functions["sinh"] = new Sinh();
    Functions["sum"] = new Sum();
    Functions["sumif"] = new SumIf();
    Functions["sumifs"] = new SumIfs();
    Functions["sumproduct"] = new SumProduct();
    Functions["sumsq"] = new Sumsq();
    Functions["stdev"] = new Stdev();
    Functions["stdevp"] = new StdevP();
    Functions["stdev.s"] = new Stdev();
    Functions["stdev.p"] = new StdevP();
    Functions["subtotal"] = new Subtotal();
    Functions["exp"] = new Exp();
    Functions["log"] = new Log();
    Functions["log10"] = new Log10();
    Functions["ln"] = new Ln();
    Functions["max"] = new Max();
    Functions["maxa"] = new Maxa();
    Functions["median"] = new Median();
    Functions["min"] = new Min();
    Functions["mina"] = new Mina();
    Functions["mod"] = new Mod();
    Functions["average"] = new Average();
    Functions["averagea"] = new AverageA();
    Functions["averageif"] = new AverageIf();
    Functions["averageifs"] = new AverageIfs();
    Functions["round"] = new Round();
    Functions["rounddown"] = new Rounddown();
    Functions["roundup"] = new Roundup();
    Functions["rand"] = new Rand();
    Functions["randbetween"] = new RandBetween();
    Functions["quotient"] = new Quotient();
    Functions["trunc"] = new Trunc();
    Functions["tan"] = new Tan();
    Functions["tanh"] = new Tanh();
    Functions["atan"] = new Atan();
    Functions["atan2"] = new Atan2();
    Functions["atanh"] = new Atanh();
    Functions["acos"] = new Acos();
    Functions["acosh"] = new Acosh();
    Functions["var"] = new Var();
    Functions["varp"] = new VarP();
    Functions["large"] = new Large();
    Functions["small"] = new Small();
    Functions["degrees"] = new Degrees();
    // Information
    Functions["isblank"] = new IsBlank();
    Functions["isnumber"] = new IsNumber();
    Functions["istext"] = new IsText();
    Functions["isnontext"] = new IsNonText();
    Functions["iserror"] = new IsError();
    Functions["iserr"] = new IsErr();
    Functions["error.type"] = new ErrorType();
    Functions["iseven"] = new IsEven();
    Functions["isodd"] = new IsOdd();
    Functions["islogical"] = new IsLogical();
    Functions["isna"] = new IsNa();
    Functions["na"] = new Na();
    Functions["n"] = new N();
    // Logical
    Functions["if"] = new If();
    Functions["iferror"] = new IfError();
    Functions["ifna"] = new IfNa();
    Functions["not"] = new Not();
    Functions["and"] = new And();
    Functions["or"] = new Or();
    Functions["true"] = new True();
    Functions["false"] = new False();
    // Reference and lookup
    Functions["address"] = new Address();
    Functions["hlookup"] = new HLookup();
    Functions["vlookup"] = new VLookup();
    Functions["lookup"] = new Lookup();
    Functions["match"] = new Match();
    Functions["row"] = new Row {
      SkipArgumentEvaluation = true,
    };
    Functions["rows"] = new Rows {
      SkipArgumentEvaluation = true,
    };
    Functions["column"] = new Column {
      SkipArgumentEvaluation = true,
    };
    Functions["columns"] = new Columns {
      SkipArgumentEvaluation = true,
    };
    Functions["choose"] = new Choose();
    Functions["index"] = new Index();
    Functions["indirect"] = new Indirect();
    Functions["offset"] = new Offset {
      SkipArgumentEvaluation = true,
    };
    // Date
    Functions["date"] = new Date();
    Functions["today"] = new Today();
    Functions["now"] = new Now();
    Functions["day"] = new Day();
    Functions["month"] = new Month();
    Functions["year"] = new Year();
    Functions["time"] = new Time();
    Functions["hour"] = new Hour();
    Functions["minute"] = new Minute();
    Functions["second"] = new Second();
    Functions["weeknum"] = new Weeknum();
    Functions["weekday"] = new Weekday();
    Functions["days360"] = new Days360();
    Functions["yearfrac"] = new Yearfrac();
    Functions["edate"] = new Edate();
    Functions["eomonth"] = new Eomonth();
    Functions["isoweeknum"] = new IsoWeekNum();
    Functions["workday"] = new Workday();
    // Database
    Functions["dget"] = new Dget();
    Functions["dcount"] = new Dcount();
    Functions["dcounta"] = new DcountA();
    Functions["dmax"] = new Dmax();
    Functions["dmin"] = new Dmin();
    Functions["dsum"] = new Dsum();
    Functions["daverage"] = new Daverage();
    Functions["dvar"] = new Dvar();
    Functions["dvarp"] = new Dvarp();
  }
}
