Загрузка данных


namespace ConsoleApp1
{
    public class Program
    {
        static void Main(string[] args)
        {
            Equipment[] equipments =
            [
                new(1, "Отвертка", 50),
                new(2, "Клюшка для гольфа", 42),
                new(3, "Холодильник", 80),
                new(4, "Веревка", 205),
                new(5, "Окно", 15),
                new(6, "Стол", 90),
                new(7, "Параплан", 65),
                new(8, "Кирка из Minecraft", 42),
                new(9, "Подводная лодка", 70),
                new(10, "Камень", 250)

            ];

            bool isContinue = true;
            while (isContinue)
            {
                Console.Write("\tМеню\n" +
                    "1. Просмотр оборудования\n" +
                    "2. Выбор единицы\n" +
                    "3. Изменение суточной стоимости\n" +
                    "4. Выдача\n" +
                    "5. Возврат\n" +
                    "0. Выход\n" +
                    "Выберите действие: ");
                string? selectedAction = Console.ReadLine();
                Console.WriteLine();

                int selectedEquipment;

                switch (selectedAction)
                {
                    case "1":
                        PrintEquipments(equipments);

                        break;
                    case "2":
                        PrintEquipments(equipments);

                        Console.Write("Выберите оборудование: ");
                        while (!int.TryParse(Console.ReadLine(), out selectedEquipment) || !(selectedEquipment >= 1 && selectedEquipment <= equipments.Length))
                            Console.Write("Неверный ввод!\n" +
                                "Выберите оборудование: ");
                        selectedEquipment--;
                        Console.WriteLine();

                        Console.Write("1. Изменение суточной стоимости\n" +
                            "2. Выдача\n" +
                            "3. Возврат\n" +
                            "Выебрите действие: ");
                        int selectedAction_;
                        while (!int.TryParse(Console.ReadLine(), out selectedAction_) || !(selectedAction_ >= 1 && selectedAction_ <= 3))
                            Console.Write("Неверный ввод!\n" +
                                "Выберите действие: ");
                        Console.WriteLine();

                        switch (selectedAction_)
                        {
                            case 1:
                                Console.WriteLine((ChangeDailyRate(equipments[selectedEquipment]) ? "Успешное изменение суточной стоимости!" : "Не удалось изменить суточную стоимость"));

                                break;
                            case 2:
                                Console.WriteLine((RentEquipment(equipments[selectedEquipment]) ? "Оборудование успешно выдано!" : "Ошибка выдачи оборудования!"));

                                break;
                            case 3:
                                Console.WriteLine((equipments[selectedEquipment].ReturnEquipment()? "Оборудование успешно возвращено!" : "Ошибка возврата оборудования! Оборудование не выдавалось!"));

                                break;

                            default:
                                Console.WriteLine("Ошибка ввода!");

                                break;

                        }

                        break;
                    case "3":
                        PrintEquipments(equipments);

                        Console.Write("Выберите оборудование: ");
                        while (!int.TryParse(Console.ReadLine(), out selectedEquipment) || !(selectedEquipment >= 1 && selectedEquipment <= equipments.Length))
                            Console.Write("Неверный ввод!\n" +
                                "Выберите оборудование: ");
                        selectedEquipment--;
                        Console.WriteLine();


                        Console.WriteLine((ChangeDailyRate(equipments[selectedEquipment]) ? "Успешное изменение суточной стоимости!" : "Не удалось изменить суточную стоимость"));

                        break;
                    case "4":
                        PrintEquipments(equipments);

                        Console.Write("Выберите оборудование: ");
                        while (!int.TryParse(Console.ReadLine(), out selectedEquipment) || !(selectedEquipment >= 1 && selectedEquipment <= equipments.Length))
                            Console.Write("Неверный ввод!\n" +
                                "Выберите оборудование: ");
                        selectedEquipment--;
                        Console.WriteLine();

                        Console.WriteLine((RentEquipment(equipments[selectedEquipment]) ? "Оборудование успешно выдано!" : "Ошибка выдачи оборудования!"));

                        break;
                    case "5":
                        PrintEquipments(equipments);

                        Console.Write("Выберите оборудование: ");
                        while (!int.TryParse(Console.ReadLine(), out selectedEquipment) || !(selectedEquipment >= 1 && selectedEquipment <= equipments.Length))
                            Console.Write("Неверный ввод!\n" +
                                "Выберите оборудование: ");
                        selectedEquipment--;
                        Console.WriteLine();

                        Console.WriteLine((equipments[selectedEquipment].ReturnEquipment() ? "Оборудование успешно возвращено!" : "Ошибка возврата оборудования! Оборудование не выдавалось!"));

                        break;
                    case "0":
                        isContinue = false;
                        break;

                    default:
                        Console.WriteLine("Неизвестная команда, повторите ввод");
                        break;

                }

                Console.Write("\nНажмите любую клавишу, чтобы продолжить..."); Console.ReadKey();
                Console.Clear();

            }

        }

        static void PrintEquipments(Equipment[] equipments)
        {
            for (int i = 0; i < equipments.Length; i++)
                Console.WriteLine($"{i + 1}. {equipments[i].FullInfo}");

        }
        
        static bool ChangeDailyRate(Equipment equipment)
        {
            if (equipment.IsAvailable)
            {
                Console.Write("Введите суточную стоимость для изменения: ");
                decimal dailyRate;
                while (!decimal.TryParse(Console.ReadLine(), out dailyRate) || dailyRate <= 0)
                    Console.Write("Неверный ввод!\n" +
                                    "Введите суточную стоимость для изменения: ");

                equipment.DailyRate = dailyRate;

                return true;
            }
            else
            {
                Console.WriteLine("Пока оборудование выдано, изменять суточную стоимость нельзя");

                return false;
            }
        }

        static bool RentEquipment(Equipment equipment)
        {
            if (equipment.IsAvailable)
            {
                Console.Write("Введите срок проката: ");
                int currentRentalDays;
                while (!int.TryParse(Console.ReadLine(), out currentRentalDays) || currentRentalDays <= 0)
                    Console.Write("Неверный ввод!\n" +
                        "Введите срок проката: ");

                if (equipment.Rent(currentRentalDays))
                    return true;
                else
                    return false;
            }
            else
            {
                Console.WriteLine("Оборудование уже выдано!");

                return false;
            }

        }

    }

    public class Equipment
    {
        private readonly int inventoryNumber;
        private string name;
        private decimal dailyRate;



        public int InventoryNumber { get { return inventoryNumber; } }
        public string Name
        {
            get { return name; }
            set
            {
                if (string.IsNullOrWhiteSpace(value))
                    throw new Exception("Имя оборудования не может быть пустым");
                else
                    name = value;
            }
        }
        public decimal DailyRate
        {
            get { return dailyRate; }
            set
            {
                if (!IsAvailable)
                    throw new Exception("Пока оборудование выдано, изменять суточную стоимость нельзя");
                else if (value <= 0)
                    throw new Exception("Значение суточной стоимости не может быть меньше или равно нулю");
                else
                    dailyRate = value;
            }
        }
        public int CurrentRentalDays { get; private set; } = 0;
        public bool IsAvailable
        {
            get
            {
                return CurrentRentalDays == 0 ? true : false;
            }
        }
        public decimal CurrentRentalCost { get { return DailyRate * CurrentRentalDays; } }
        public string FullInfo
        {
            get
            {
                return $"Инвентарный номер: {InventoryNumber} | Название: {Name}\n" +
                    $"\tСуточная стоимость: {DailyRate}\n" +
                    $"\tДоступность оборудования: {(IsAvailable ? "Доступно" : "Недоступно")}\n" +
                    $"\tСрок текущего проката: {(IsAvailable ? "-" : CurrentRentalDays)}\n" +
                    $"\tСтоимость текущего проката: {(IsAvailable ? "-" : CurrentRentalCost)}";
            }
        }

        public Equipment(int inventoryNumber, string name, decimal dailyRate)
        {
            this.inventoryNumber = inventoryNumber;
            Name = name;
            DailyRate = dailyRate;

        }

        public bool Rent()
        {
            if (IsAvailable)
                CurrentRentalDays = 1;
            else
                return false;

            return true;
        }

        public bool Rent(int currentRentalDays)
        {
            if (IsAvailable && currentRentalDays > 0)
                CurrentRentalDays = currentRentalDays;
            else
                return false;

            return true;
        }

        public bool ReturnEquipment()
        {
            if (!IsAvailable)
                CurrentRentalDays = 0;
            else
                return false;

            return true;
        }

    }

}