using System;
using System.Text;

namespace HslCommunication.BasicFramework
{
    /****************************************************************************
     * 
     *    系统的版本号类,版本号命名规则,应遵循兼容性规则
     * 
     * 
     * 
     ***************************************************************************/



    /// <summary>
    /// 系统版本类,由三部分组成,包含了一个大版本,小版本,修订版,还有一个开发者维护的内部版
    /// </summary>
    [Serializable]
    public sealed class SystemVersion
    {

        #region Constructor


        /// <summary>
        /// 根据格式化字符串的版本号初始化
        /// </summary>
        /// <param name="VersionString">格式化的字符串,例如:1.0或1.0.0或1.0.0.0503</param>
        public SystemVersion(string VersionString)
        {
            string[] temp = VersionString.Split('.');

            if (temp.Length >= 2)
            {
                m_MainVersion = Convert.ToInt32(temp[0]);
                m_SecondaryVersion = Convert.ToInt32(temp[1]);
            }


            if (temp.Length >= 3)
            {
                m_EditVersion = Convert.ToInt32(temp[2]);

            }


            if (temp.Length >= 4)
            {
                m_InnerVersion = Convert.ToInt32(temp[3]);
            }
        }
        /// <summary>
        /// 根据指定的数字实例化一个对象
        /// </summary>
        /// <param name="main">主版本</param>
        /// <param name="sec">次版本</param>
        /// <param name="edit">修订版</param>
        public SystemVersion(int main, int sec, int edit)
        {
            m_MainVersion = main;
            m_SecondaryVersion = sec;
            m_EditVersion = edit;
        }
        /// <summary>
        /// 根据指定的数字实例化一个对象
        /// </summary>
        /// <param name="main">主版本</param>
        /// <param name="sec">次版本</param>
        /// <param name="edit">修订版</param>
        /// <param name="inner">内部版本号</param>
        public SystemVersion(int main, int sec, int edit, int inner)
        {
            m_MainVersion = main;
            m_SecondaryVersion = sec;
            m_EditVersion = edit;
            m_InnerVersion = inner;
        }


        #endregion

        #region Private Member

        private int m_MainVersion = 2;                // 主版本
        private int m_SecondaryVersion = 0;           // 次版本
        private int m_EditVersion = 0;                // 修订版
        private int m_InnerVersion = 0;               // 内部版

        #endregion

        #region Public Properties


        /// <summary>
        /// 主版本
        /// </summary>
        public int MainVersion
        {
            get
            {
                return m_MainVersion;
            }
        }


        /// <summary>
        /// 次版本
        /// </summary>
        public int SecondaryVersion
        {
            get
            {
                return m_SecondaryVersion;
            }
        }

        /// <summary>
        /// 修订版
        /// </summary>
        public int EditVersion
        {
            get
            {
                return m_EditVersion;
            }
        }
        /// <summary>
        /// 内部版本号,或者是版本号表示为年月份+内部版本的表示方式
        /// </summary>
        public int InnerVersion
        {
            get { return m_InnerVersion; }
        }


        #endregion

        #region Object Override


        /// <summary>
        /// 根据格式化为支持返回的不同信息的版本号
        /// C返回1.0.0.0
        /// N返回1.0.0
        /// S返回1.0
        /// </summary>
        /// <param name="format">格式化信息</param>
        /// <returns>版本号信息</returns>
        public string ToString(string format)
        {
            if (format == "C")
            {
                return $"{MainVersion}.{SecondaryVersion}.{EditVersion}.{InnerVersion}";
            }

            if (format == "N")
            {
                return $"{MainVersion}.{SecondaryVersion}.{EditVersion}";
            }

            if (format == "S")
            {
                return $"{MainVersion}.{SecondaryVersion}";
            }

            return ToString();
        }

        /// <summary>
        /// 获取版本号的字符串形式,如果内部版本号为0,则显示时不携带
        /// </summary>
        /// <returns>版本号信息</returns>
        public override string ToString()
        {
            if (InnerVersion == 0)
            {
                return ToString("N");
            }
            else
            {
                return ToString("C");
            }
        }


        /// <summary>
        /// 判断两个实例是否相等
        /// </summary>
        /// <param name="obj">版本号</param>
        /// <returns>是否一致</returns>
        public override bool Equals(object obj)
        {
            return base.Equals(obj);
        }


        /// <summary>
        /// 获取哈希值
        /// </summary>
        /// <returns>哈希值</returns>
        public override int GetHashCode()
        {
            return base.GetHashCode();
        }

        #endregion

        #region operator implementation

        /// <summary>
        /// 判断是否相等
        /// </summary>
        /// <param name="SV1">第一个版本</param>
        /// <param name="SV2">第二个版本</param>
        /// <returns>是否相同</returns>
        public static bool operator ==(SystemVersion SV1, SystemVersion SV2)
        {
            if (SV1.MainVersion != SV2.MainVersion)
            {
                return false;
            }

            if (SV1.SecondaryVersion != SV2.SecondaryVersion)
            {
                return false;
            }

            if (SV1.m_EditVersion != SV2.m_EditVersion)
            {
                return false;
            }

            if (SV1.InnerVersion != SV2.InnerVersion)
            {
                return false;
            }

            return true;
        }
        /// <summary>
        /// 判断是否不相等
        /// </summary>
        /// <param name="SV1">第一个版本号</param>
        /// <param name="SV2">第二个版本号</param>
        /// <returns>是否相同</returns>
        public static bool operator !=(SystemVersion SV1, SystemVersion SV2)
        {
            if (SV1.MainVersion != SV2.MainVersion)
            {
                return true;
            }

            if (SV1.SecondaryVersion != SV2.SecondaryVersion)
            {
                return true;
            }

            if (SV1.m_EditVersion != SV2.m_EditVersion)
            {
                return true;
            }

            if (SV1.InnerVersion != SV2.InnerVersion)
            {
                return true;
            }

            return false;
        }
        /// <summary>
        /// 判断一个版本是否大于另一个版本
        /// </summary>
        /// <param name="SV1">第一个版本</param>
        /// <param name="SV2">第二个版本</param>
        /// <returns>是否相同</returns>
        public static bool operator >(SystemVersion SV1, SystemVersion SV2)
        {
            if (SV1.MainVersion > SV2.MainVersion)
            {
                return true;
            }
            if (SV1.MainVersion < SV2.MainVersion)
            {
                return false;
            }



            if (SV1.SecondaryVersion > SV2.SecondaryVersion)
            {
                return true;
            }
            if (SV1.SecondaryVersion < SV2.SecondaryVersion)
            {
                return false;
            }



            if (SV1.EditVersion > SV2.EditVersion)
            {
                return true;
            }
            if (SV1.EditVersion < SV2.EditVersion)
            {
                return false;
            }

            if (SV1.InnerVersion > SV2.InnerVersion)
            {
                return true;
            }
            if (SV1.InnerVersion < SV2.InnerVersion)
            {
                return false;
            }

            return false;
        }

        /// <summary>
        /// 判断第一个版本是否小于第二个版本
        /// </summary>
        /// <param name="SV1">第一个版本号</param>
        /// <param name="SV2">第二个版本号</param>
        /// <returns>是否小于</returns>
        public static bool operator <(SystemVersion SV1, SystemVersion SV2)
        {
            if (SV1.MainVersion < SV2.MainVersion)
            {
                return true;
            }
            if (SV1.MainVersion > SV2.MainVersion)
            {
                return false;
            }



            if (SV1.SecondaryVersion < SV2.SecondaryVersion)
            {
                return true;
            }
            if (SV1.SecondaryVersion > SV2.SecondaryVersion)
            {
                return false;
            }



            if (SV1.EditVersion < SV2.EditVersion)
            {
                return true;
            }
            if (SV1.EditVersion > SV2.EditVersion)
            {
                return false;
            }

            if (SV1.InnerVersion < SV2.InnerVersion)
            {
                return true;
            }
            if (SV1.InnerVersion > SV2.InnerVersion)
            {
                return false;
            }

            return false;
        }

        #endregion

    }

    /// <summary>
    /// 版本信息类,用于展示版本发布信息
    /// </summary>
    public sealed class VersionInfo
    {
        /// <summary>
        /// 版本的发行日期
        /// </summary>
        public DateTime ReleaseDate { get; set; } = DateTime.Now;

        /// <summary>
        /// 版本的更新细节
        /// </summary>
        public StringBuilder UpdateDetails { get; set; } = new StringBuilder();

        /// <summary>
        /// 版本号
        /// </summary>
        public SystemVersion VersionNum { get; set; } = new SystemVersion(1, 0, 0);

        /// <summary>
        /// 获取版本号
        /// </summary>
        /// <returns>字符串信息</returns>
        public override string ToString()
        {
            return VersionNum.ToString();
        }
    }

}