using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using C1.WPF;

namespace FlexSheetSample
{
    public class ExcelCalcFunctionMenu : ContextMenu
    {
        /// <summary>
        /// Initializes a new instance of an <see cref="ExcelCalcFunctionMenu"/>.
        /// </summary>
        public ExcelCalcFunctionMenu()
        {
            AddItems("Logical", LOGICAL);
            AddItems("Math/Trigonometry", MATH);
            AddItems("Statistical", STATISTICAL);
            AddItems("Text", TEXT);
            AddItems("Lookup", LOOKUP);
            AddItems("DateTime", DATETIME);
        }

        // adds a function category to the menu
        void AddItems(string category, string functions)
        {
            var group = new MenuItem();
            group.Header = category;

            foreach (var fn in functions.Split('\r', '\n'))
            {
                var data = fn.Split('\t');
                if (data.Length == 3)
                {
                    var item = new MenuItem();
                    item.Header = data[0].Trim();
                    var toolTip = string.Format("{0}\r\n\r\n{1}", data[1].Trim(), data[2].Trim());
                    ToolTipService.SetToolTip(item, toolTip);
                    group.Items.Add(item);
                }
            }

            this.Items.Add(group);
        }

        // function names, descriptions, and parameters (from excel sheet in Documentation folder)
        const string LOGICAL =
            @"AND	Returns TRUE if all of its arguments are TRUE	=AND(logical1[, logical2,…])
            FALSE	Returns the logical value FALSE	=FALSE
            IF	Specifies a logical test to perform	=IF(logical_test, value_if_true, value_if_false)
            NOT	Reverses the logic of its argument	=NOT(logical)
            OR	Returns TRUE if any argument is TRUE	=OR(logical1[, logical2,…])
            TRUE	Returns the logical value TRUE	=TRUE";
        const string MATH =
            @"ABS	Returns the absolute value of a number	=ABS(number)
            ACOS	Returns the arccosine of a number	=ACOS(number)
            ASIN	Returns the arcsine of a number	=ASIN(number)
            ATAN	Returns the arctangent of a number	=ATAN(number)
            ATAN2	Returns the arctangent from x- and y-coordinates	=ATAN2(x_num, y_num)
            CEILING	Rounds a number to the nearest integer or to the nearest multiple of significance	=CEILING(number)
            COS	Returns the cosine of a number	=COS(number)
            COSH	Returns the hyperbolic cosine of a number	=COSH(number)
            EXP	Returns e raised to the power of a given number	=EXP(number)
            FLOOR	Rounds a number down, toward zero	=FLOOR(number)
            INT	Rounds a number down to the nearest integer	=INT(number)
            LN	Returns the natural logarithm of a number	=LN(number)
            LOG	Returns the logarithm of a number to a specified base	=LOG(number[, base])
            LOG10	Returns the base-10 logarithm of a number	=LOG10(number)
            PI	Returns the value of pi	=PI()
            POWER	Returns the result of a number raised to a power	=POWER(number, power)
            RAND	Returns a random number between 0 and 1	=RAND()
            RANDBETWEEN	Returns a random number between the numbers you specify	=RANDBETWEEN(bottom, top)
            SIGN	Returns the sign of a number	=SIGN(number)
            SIN	Returns the sine of the given angle	=SIN(number)
            SINH	Returns the hyperbolic sine of a number	=SINH(number)
            SQRT	Returns a positive square root	=SQRT(number)
            SUM	Adds its arguments	=SUM(number1[, number2, …])
            TAN	Returns the tangent of a number	=TAN(number)
            TANH	Returns the hyperbolic tangent of a number	=TANH(number)
            TRUNC	Truncates a number to an integer	=TRUNC(number)";
        const string STATISTICAL =
            @"AVERAGE	Returns the average of its arguments	
            AVERAGEA	Returns the average of its arguments, including numbers, text, and logical values	=AVERAGE(number1 [, number2, …])
            COUNT	Counts how many numbers are in the list of arguments	=AVERAGEA(number1 [, number2, …])
            COUNTA	Counts how many values are in the list of arguments	=COUNT(number1 [, number2, …])
            COUNTBLANK	Counts the number of blank cells within a range	=COUNTA(number1 [, number2, …])
            COUNTIF	Counts the number of cells within a range that meet the given criteria	=COUNTIF(range, criteria)
            MAX	Returns the maximum value in a list of arguments	=MAX(number1 [, number2, …])
            MAXA	Returns the maximum value in a list of arguments, including numbers, text, and logical values	=MAXA(number1 [, number2, …])
            MIN	Returns the minimum value in a list of arguments	=MIN(number1 [, number2, …])
            MINA	Returns the smallest value in a list of arguments, including numbers, text, and logical values	=MINA(number1 [, number2, …])
            STDEV	Estimates standard deviation based on a sample	=STDEV(number1 [, number2, …])
            STDEVA	Estimates standard deviation based on a sample, including numbers, text, and logical values	=STDEVA(number1 [, number2, …])
            STDEVP	Calculates standard deviation based on the entire population	=STDEVP(number1 [, number2, …])
            STDEVPA	Calculates standard deviation based on the entire population, including numbers, text, and logical values	=STDEVPA(number1 [, number2, …])
            VAR	Estimates variance based on a sample	=VAR(number1 [, number2, …])
            VARA	Estimates variance based on a sample, including numbers, text, and logical values	=VARA(number1 [, number2, …])
            VARP	Calculates variance based on the entire population	=VARP(number1 [, number2, …])
            VARPA	Calculates variance based on the entire population, including numbers, text, and logical values	=VARPA(number1 [, number2, …])";
        const string TEXT =
            @"CHAR	Returns the character specified by the code number	=CHAR(number)
            CODE	Returns a numeric code for the first character in a text string	=CODE(text)
            CONCATENATE	Joins several text items into one text item	=CONCATENATE(text1 [, text2, …])
            FIND	Finds one text value within another (case-sensitive)	=FIND(find_text, within_text [, start_num])
            LEFT	Returns the leftmost characters from a text value	=LEFT(text[, num_chars])
            LEN	Returns the number of characters in a text string	=LEN(text)
            LOWER	Converts text to lowercase	=LOWER(text)
            MID	Returns a specific number of characters from a text string starting at the position you specify	=MID(text, start_num, num_chars)
            PROPER	Capitalizes the first letter in each word of a text value	=PROPER(text)
            REPLACE	Replaces characters within text	=REPLACE(old_text, stat_num, num_chars, new_text)
            REPT	Repeats text a given number of times	=REPT(trext, number_times)
            RIGHT	Returns the rightmost characters from a text value	=RIGHT(text[, num_chars])
            SEARCH	Finds one text value within another (not case-sensitive)	=SEARCH(find_text, within_text[, start_num])
            SUBSTITUTE	Substitutes new text for old text in a text string	=SUBSTITUTE(text, old_text, new_text[, instance_num])
            T	Converts its arguments to text	=T(value)
            TEXT	Formats a number and converts it to text	=TEXT(value, format_text)
            TRIM	Removes spaces from text	=TRIM(text)
            UPPER	Converts text to uppercase	=UPPER(text)
            VALUE	Converts a text argument to a number	=VALUE(text)";
        const string LOOKUP =
            @"LOOKUP Look in a single row or column and find a value from the same position in a second row or column.  =LOOKUP(value, lookup_range, result_range)
              VLOOKUP Find things in a range by row. =VLOOKUP(value, lookup_range, column_index[, approximate_match])
              HLOOKUP Find things in a range by column. HLOOKUP(value, lookup_range, row_index[, approximate_match])";
        const string DATETIME =
            @"NOW Return the current date time.  =NOW()
              TODAY Return the current date. =TODAY()";
    }
}
