using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;
using System.Runtime.Serialization;

namespace FormulaEditor
{
    /// <summary>
    /// Subscripted index
    /// </summary>
    public class SubscriptedSymbol : SimpleSymbol
    {
        /// <summary>
        /// Subscript
        /// </summary>
        protected string sub;

        /// <summary>
        /// Pair
        /// </summary>
        protected StringPair pair;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="s">String</param>
        /// <param name="sub">Subsript</param>
        public SubscriptedSymbol(string s, string sub)
            : base('f', (int)FormulaConstants.Series, true, s)
        {
            this.sub = sub;
            pair = new StringPair(s, sub);
        }

        public SubscriptedSymbol(SerializationInfo info, StreamingContext context)
            : base(info, context)
        {
            sub = info.GetValue("Sub", typeof(string)) + "";
            pair = new StringPair(s, sub);
        }

        public override void GetObjectData(SerializationInfo info, StreamingContext context)
        {
            base.GetObjectData(info, context);
            info.AddValue("Sub", sub, typeof(string));
        }

        public override void SetToFormula(MathFormula formula)
        {

        }


        /// <summary>
        /// The symbol pair
        /// </summary>
        public StringPair Pair
        {
            get
            {
                return pair;
            }
        }


        /// <summary>
        /// ICloneable interface implementation
        /// </summary>
        /// <returns></returns>
        public override object Clone()
        {
            return new SubscriptedSymbol(s, sub);
        }

    }

    /// <summary>
    /// Pair of strings
    /// </summary>
    public class StringPair
    {
        /// <summary>
        /// First string
        /// </summary>
        string s1;

        /// <summary>
        /// Second string
        /// </summary>
        string s2;

        /// <summary>
        /// Constructor
        /// </summary>
        /// <param name="s1">First string</param>
        /// <param name="s2">Second string</param>
        public StringPair(string s1, string s2)
        {
            this.s1 = s1;
            this.s2 = s2;
        }
        public override int GetHashCode()
        {
            return s1.GetHashCode() * s2.GetHashCode();
        }

        public override bool Equals(object obj)
        {
            if (obj is StringPair)
            {
                StringPair p = obj as StringPair;
                return (s1.Equals(p.s1) & s2.Equals(p.s2));
            }
            return false;
        }

        /// <summary>
        /// First string
        /// </summary>
        public string First
        {
            get
            {
                return s1;
            }
        }


        /// <summary>
        /// Second string
        /// </summary>
        public string Second
        {
            get
            {
                return s2;
            }
        }
    }

}
