internal void Run()
        {
            int instructionIndex = 0;

            this.m_Manager = new GarageManager();

            while (true)
            {
                try
                {
                    instructionIndex = ChatBot.GreetUser();
                    switch (instructionIndex)
                    {
                    case 1:
                        this.m_Manager.AddNewVehicle();
                        break;

                    case 2:
                        this.m_Manager.PrintLicencePlatesInGarageByFilter();
                        break;

                    case 3:
                        this.m_Manager.ChangeVehicleStatus();
                        break;

                    case 4:
                        this.m_Manager.InflateWheels();
                        break;

                    case 5:
                        this.m_Manager.FillEnergyInVehicle(true);     // For fuel
                        break;

                    case 6:
                        this.m_Manager.FillEnergyInVehicle(false);     // For electric
                        break;

                    case 7:
                        this.m_Manager.GetVehicleDetails();
                        break;

                    default:
                        Console.WriteLine("You didn't choose a valid option");
                        break;
                    }
                }
                catch (FormatException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        internal void CheckVehicleStatus()
        {
            string licensePlateNumber = GetLicensePlateNumber();

            try
            {
                eStatusInGarage vehicleState = this.m_MyGarage.GetStatusByLicensePlateNumber(licensePlateNumber);
                ChatBot.PrintStatus(vehicleState, licensePlateNumber);
            }
            catch (VehicleNotInGarageException e)
            {
                ChatBot.PrintLicensePlateNotFoundMessage(licensePlateNumber);
            }
        }
        internal void ChangeVehicleStatus()
        {
            string          licensePlateNumber = GetLicensePlateNumber();
            string          newStatusAsString;
            eStatusInGarage newStatus;

            try
            {
                newStatusAsString = ChatBot.GetUpdatedStatus(licensePlateNumber);
                eStatusInGarage.TryParse(newStatusAsString, out newStatus);
                m_MyGarage.ChangeVehicleStatus(licensePlateNumber, newStatus);
            }
            catch (VehicleNotInGarageException e)
            {
                ChatBot.PrintLicensePlateNotFoundMessage(licensePlateNumber);
            }
        }
        private string GetLicensePlateNumber()
        {
            string licensePlateNumber = ChatBot.GetLicensePlateNumber();

            while (!this.m_MyGarage.IsExistInGarage(licensePlateNumber))
            {
                try
                {
                    licensePlateNumber = ChatBot.GetLicensePlateNumber();
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                }
            }

            return(licensePlateNumber);
        }
        internal void AddNewVehicle()
        {
            int    o_VehicleType = 0;
            string o_ModelName;
            string o_LicensePlateNumber;
            string o_OwnerName;
            string o_OwnerPhoneNumber;
            char   o_IsFuelBased;

            ChatBot.GetVehicleGeneralDetails(out o_VehicleType, out o_ModelName, out o_IsFuelBased, out o_LicensePlateNumber);
            SetOwnerDetails(out o_OwnerName, out o_OwnerPhoneNumber);
            bool v_IsFuelBased = o_IsFuelBased == 'F' || o_IsFuelBased == 'f' ? true : false;
            Dictionary <string, string> extraFeatursDictionary = GetExtraFeatures(o_VehicleType);

            m_MyGarage.AddVehicle(o_VehicleType, o_ModelName, o_LicensePlateNumber, o_OwnerName, o_OwnerPhoneNumber, v_IsFuelBased, extraFeatursDictionary);
            SetEnergyType(o_LicensePlateNumber);
            SetWheels(o_LicensePlateNumber);
        }
        internal void GetVehicleDetails()
        {
            string licensePlateNumber = GetLicensePlateNumber();
            string vehicleInfo;

            try
            {
                vehicleInfo = this.m_MyGarage.GetVehicleDetails(licensePlateNumber);
                Console.WriteLine(vehicleInfo);
                Console.WriteLine();
                Console.WriteLine("To go back to the main menu - press any key");
                Console.ReadLine();
                Console.Clear();
            }
            catch (VehicleNotInGarageException e)
            {
                ChatBot.PrintLicensePlateNotFoundMessage(licensePlateNumber);
            }
        }
        private void SetOwnerDetails(out string o_OwnerName, out string o_OwnerPhoneNumber)
        {
            bool isSuccessPhoneNumber = false;

            o_OwnerPhoneNumber = "";
            ChatBot.GetOwnerName(out o_OwnerName);
            while (!isSuccessPhoneNumber)
            {
                try
                {
                    ChatBot.GetOwnerPhoneNumber(o_OwnerName, out o_OwnerPhoneNumber);
                    isSuccessPhoneNumber = true;
                }
                catch (FormatException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        private void SetWheels(string i_LicensePlateNumber)
        {
            string manufacturerName;
            float  curAirPressure = 0;
            bool   isSuccess      = false;

            ChatBot.GetWheelsManufacturer(i_LicensePlateNumber, out manufacturerName);
            while (!isSuccess)
            {
                try
                {
                    curAirPressure = ChatBot.GetCurAirPressure(i_LicensePlateNumber);
                    m_MyGarage.SetWheels(i_LicensePlateNumber, manufacturerName, curAirPressure);
                    isSuccess = true;
                }
                catch (ValueOutOfRangeException e)
                {
                    ChatBot.PrintValueOutOfRangeMessage(e.MaxValue, e.MinValue);
                }
            }
        }
        internal void FillEnergyInVehicle(bool isFuelRequired)
        {
            bool       chargedSuccessfully = false;
            bool       isFuelVehicle;
            float      amountToFill = 0;
            eFuelTypes fuelType;
            string     fuelTypeCode;
            string     licensePlateNumber = GetLicensePlateNumber();

            while (!chargedSuccessfully)
            {
                try
                {
                    isFuelVehicle = this.m_MyGarage.IsFuelBasedVehicle(licensePlateNumber);
                    if (isFuelVehicle)
                    {
                        if (isFuelRequired)
                        {
                            ChatBot.GetFuelingDetails(licensePlateNumber, out amountToFill, out fuelTypeCode);
                            eFuelTypes.TryParse(fuelTypeCode, out fuelType);
                            this.m_MyGarage.FillEnergy(licensePlateNumber, amountToFill, fuelType);
                        }
                        else
                        {
                            Console.WriteLine("Your vehicle based on Fuel, please select option #5.");
                        }
                    }
                    else
                    {
                        if (!isFuelRequired)
                        {
                            amountToFill = ChatBot.GetChargingDetails(licensePlateNumber);
                            this.m_MyGarage.FillEnergy(licensePlateNumber, amountToFill);
                        }
                        else
                        {
                            Console.WriteLine("Your vehicle based on Electric, please select option #6.");
                        }
                    }
                    Console.WriteLine("Please prees enter");
                    Console.ReadLine();
                    chargedSuccessfully = true;
                }
                catch (VehicleNotInGarageException e)
                {
                    ChatBot.PrintLicensePlateNotFoundMessage(licensePlateNumber);
                }
                catch (ValueOutOfRangeException e)
                {
                    ChatBot.PrintValueOutOfRangeMessage(e.MaxValue, e.MinValue);
                }
                catch (System.ArgumentException e)
                {
                    eFuelTypes.TryParse(e.Message, out fuelType);
                    ChatBot.PrintFuelTypeErrorMessage(fuelType);
                }
                catch (System.FormatException e)
                {
                    Console.WriteLine(e.Message);
                }
            }
        }
        private Dictionary <string, string> GetExtraFeatures(int io_VehicleType)
        {
            Dictionary <string, string> extraFeatursDictionary = ChatBot.GetExtraFeatures(io_VehicleType);

            return(extraFeatursDictionary);
        }