using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Session2
{
    public class REG_MARK_LIB
    {
        public static string Symbols = "ABEKMHOPCTYX";//буквы английские
        public static Random rnd = new Random();
        /// <summary>
        /// Метод для проверки номерного знака
        /// </summary>
        /// <param name="mark">Существующий номер</param>
        /// <returns>Значение true или false, отвечающее за существование этого знака</returns>
        public static Boolean CheckMark(String mark)
        {
            try
            {
                bool result = true; // a999aa999 
                if (mark.Length == 9)
                {
                    int tmp = 0;

                    foreach (char s in mark)//проверка отдельных символов
                    {
                        if ((tmp == 0) || (tmp > 3 && tmp < 6))//буквы
                        {
                            if (!Symbols.Contains(s))
                            {
                                result = false;
                                break;
                            }
                        }
                        else if ((tmp > 0 && tmp < 4) || (tmp > 5 && tmp < 4))//цифры
                        {
                            if (!Char.IsDigit(s))
                            {
                                result = false;
                                break;
                            }
                        }
                        tmp++;
                    }


                }
                else result = false;
                return result;
            }
            catch
            {
                throw new Exception();
            }
        }
        /// <summary>
        /// Расчет следующего номера
        /// </summary>
        /// <param name="mark">Существующий номер</param>
        /// <returns>Возвращает следующий номер</returns>
        /// <exception cref="Exception">В номере меньше 8 символов</exception>
        public static String GetNextMarkAfter(String mark)
        {
            try
            {
                int strInt1 = Convert.ToInt32(mark.Substring(1, 3)) + 1;
                int strInt2 = Convert.ToInt32(mark.Substring(6, 3));
                int num1 = 0;
                int num2 = 0;
                int num3 = 0;
                int tmp = 0;
                foreach (char s in Symbols)
                {
                    if (mark[0] == s) num1 = tmp;
                    if (mark[4] == s) num1 = tmp;
                    if (mark[5] == s) num1 = tmp;
                    tmp++;
                }
                if (num3 >= 8)
                {
                    num2++;
                    num3 = 0;
                }
                if (num2 >= 8)
                {
                    num1++;
                    num2 = 0;
                }
                if (num1 >= 8) num1 = 0;
                if (strInt1 == 1000) strInt1 = 000;

                var sb = new StringBuilder();
                char rangeStart1 = Symbols[num1];
                char rangeStart2 = Symbols[num2];
                char rangeStart3 = Symbols[num3];
                char rangeEnd = Symbols[Symbols.Length - 1];
                //sb.Append((char)rnd.Next(rangeStart1, rangeEnd + 1));
                sb.Append(rangeStart1);
                sb.Append($"{strInt1}");
                sb.Append(rangeStart2);
                sb.Append(rangeStart3);
                sb.Append($"{strInt2}");
                return sb.ToString();
            }
            catch
            {
                throw new Exception();
            }
        }
        /// <summary>
        /// Метод выдает номер в указанном промежутке значений
        /// </summary>
        /// <param name="prevMark">Существующий номер</param>
        /// <param name="rangeStart">Начальная граница промежутка номера</param>
        /// <param name="rangeEnd">Конечная граница промежутка номера</param>
        /// <returns></returns>
        public static String GetNextMarkAfterInRange(String prevMark, String rangeStart, String rangeEnd)
        {
            try
            {
                var sb = new StringBuilder();
                string str1 = prevMark.Substring(0, 1);
                string str2 = prevMark.Substring(4, 4);
                int strInt1 = Convert.ToInt32(prevMark.Substring(1, 3)) + 1;
                if (strInt1 == 1000) return "out of stock";
                sb.Append(str1);
                sb.Append($"{strInt1}");
                sb.Append(str2);
                return sb.ToString();
            }
            catch
            {
                throw new Exception();
            }
        }
        /// <summary>
        /// Метод для расчета оставшихся свободных номеров между указанными номерами
        /// </summary>
        /// <param name="mark1">Первая граница номеров</param>
        /// <param name="mark2">Вторая граница номеров</param>
        /// <returns>Возвращает количество свободных номеров в указанном промежутке</returns>
        public static int GetCombinationsCountInRange(String mark1, String mark2)
        {
            try
            {
                int result = 0;
                int strInt1 = Convert.ToInt32(mark1.Substring(1, 3));
                int strInt2 = Convert.ToInt32(mark2.Substring(1, 3));
                if (strInt2 - strInt1 > 0) result = strInt2 - strInt1;
                return result; //хоть это и не правильно, но да...
            }
            catch
            {
                throw new Exception();
            }
        }
    }
}
