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


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;
using CarCatalog.Модели;

namespace CarCatalog.Данные
{
    public class ХранилищеДанных
    {
        private string путьКФайлу;
        private List<Автомобиль> автомобили;
        private List<Клиент> клиенты;
        private List<Заявка> заявки;
        private int следующийИдАвто;
        private int следующийИдКлиента;
        private int следующийИдЗаявки;

        public ХранилищеДанных()
        {
            путьКФайлу = Path.Combine(Application.StartupPath, "cars.xml");
            автомобили = new List<Автомобиль>();
            клиенты = new List<Клиент>();
            заявки = new List<Заявка>();
            ЗагрузитьДанные();
        }

        private void ЗагрузитьДанные()
        {
            if (File.Exists(путьКФайлу))
            {
                try
                {
                    XmlDocument doc = new XmlDocument();
                    doc.Load(путьКФайлу);
                    
                    XmlNodeList автоУзлы = doc.SelectNodes("/Данные/Автомобили/Автомобиль");
                    if (автоУзлы != null)
                    {
                        foreach (XmlNode узел in автоУзлы)
                        {
                            Автомобиль авто = new Автомобиль();
                            авто.Ид = int.Parse(узел["Ид"].InnerText);
                            авто.Марка = узел["Марка"].InnerText;
                            авто.Модель = узел["Модель"].InnerText;
                            авто.ГодВыпуска = int.Parse(узел["ГодВыпуска"].InnerText);
                            авто.Цена = decimal.Parse(узел["Цена"].InnerText);
                            авто.ВНаличии = bool.Parse(узел["ВНаличии"].InnerText);
                            авто.ДатаВыпуска = DateTime.Parse(узел["ДатаВыпуска"].InnerText);
                            автомобили.Add(авто);
                        }
                    }
                    
                    XmlNodeList клиентыУзлы = doc.SelectNodes("/Данные/Клиенты/Клиент");
                    if (клиентыУзлы != null)
                    {
                        foreach (XmlNode узел in клиентыУзлы)
                        {
                            Клиент клиент = new Клиент();
                            клиент.Ид = int.Parse(узел["Ид"].InnerText);
                            клиент.Фио = узел["Фио"].InnerText;
                            клиент.Телефон = узел["Телефон"].InnerText;
                            клиенты.Add(клиент);
                        }
                    }
                    
                    XmlNodeList заявкиУзлы = doc.SelectNodes("/Данные/Заявки/Заявка");
                    if (заявкиУзлы != null)
                    {
                        foreach (XmlNode узел in заявкиУзлы)
                        {
                            Заявка заявка = new Заявка();
                            заявка.Ид = int.Parse(узел["Ид"].InnerText);
                            заявка.ИдКлиента = int.Parse(узел["ИдКлиента"].InnerText);
                            заявка.ЖелаемаяМарка = узел["ЖелаемаяМарка"].InnerText;
                            заявка.Статус = узел["Статус"].InnerText;
                            заявки.Add(заявка);
                        }
                    }
                }
                catch (Exception) { СоздатьТестовыеДанные(); }
            }
            else { СоздатьТестовыеДанные(); }
            
            следующийИдАвто = автомобили.Count > 0 ? автомобили.Max(a => a.Ид) + 1 : 1;
            следующийИдКлиента = клиенты.Count > 0 ? клиенты.Max(c => c.Ид) + 1 : 1;
            следующийИдЗаявки = заявки.Count > 0 ? заявки.Max(z => z.Ид) + 1 : 1;
        }

        private void СоздатьТестовыеДанные()
        {
            автомобили = new List<Автомобиль>
            {
                new Автомобиль { Ид = 1, Марка = "Тойота", Модель = "Камри", ГодВыпуска = 2022, Цена = 25000, ВНаличии = true, ДатаВыпуска = new DateTime(2022, 3, 1) },
                new Автомобиль { Ид = 2, Марка = "БМВ", Модель = "Х5", ГодВыпуска = 2023, Цена = 60000, ВНаличии = false, ДатаВыпуска = new DateTime(2023, 6, 10) }
            };
            клиенты = new List<Клиент>();
            заявки = new List<Заявка>();
            следующийИдАвто = 3;
            следующийИдКлиента = 1;
            следующийИдЗаявки = 1;
            СохранитьДанные();
        }

        private void СохранитьДанные()
        {
            XmlDocument doc = new XmlDocument();
            System.Xml.XmlDeclaration декларация = doc.CreateXmlDeclaration("1.0", "utf-8", null);
            doc.AppendChild(деклрация);
            XmlElement корень = doc.CreateElement("Данные");
            doc.AppendChild(корень);
            
            XmlElement автоЭлемент = doc.CreateElement("Автомобили");
            foreach (var авто in автомобили)
            {
                XmlElement автоузел = doc.CreateElement("Автомобиль");
                ДобавитьЭлемент(автоузел, "Ид", авто.Ид.ToString());
                ДобавитьЭлемент(автоузел, "Марка", авто.Марка);
                ДобавитьЭлемент(автоузел, "Модель", авто.Модель);
                ДобавитьЭлемент(автоузел, "ГодВыпуска", авто.ГодВыпуска.ToString());
                ДобавитьЭлемент(автоузел, "Цена", авто.Цена.ToString());
                ДобавитьЭлемент(автоузел, "ВНаличии", авто.ВНаличии.ToString());
                ДобавитьЭлемент(автоузел, "ДатаВыпуска", авто.ДатаВыпуска.ToString("yyyy-MM-dd"));
                автоЭлемент.AppendChild(автоузел);
            }
            корень.AppendChild(автоЭлемент);
            
            XmlElement клиентыЭлемент = doc.CreateElement("Клиенты");
            foreach (var клиент in клиенты)
            {
                XmlElement клиентузел = doc.CreateElement("Клиент");
                ДобавитьЭлемент(клиентузел, "Ид", клиент.Ид.ToString());
                ДобавитьЭлемент(клиентузел, "Фио", клиент.Фио);
                ДобавитьЭлемент(клиентузел, "Телефон", клиент.Телефон);
                клиентыЭлемент.AppendChild(клиентузел);
            }
            корень.AppendChild(клиентыЭлемент);
            
            XmlElement заявкиЭлемент = doc.CreateElement("Заявки");
            foreach (var заявка in заявки)
            {
                XmlElement заявкаузел = doc.CreateElement("Заявка");
                ДобавитьЭлемент(заявкаузел, "Ид", заявка.Ид.ToString());
                ДобавитьЭлемент(заявкаузел, "ИдКлиента", заявка.ИдКлиента.ToString());
                ДобавитьЭлемент(заявкаузел, "ЖелаемаяМарка", заявка.ЖелаемаяМарка);
                ДобавитьЭлемент(заявкаузел, "Статус", заявка.Статус);
                заявкиЭлемент.AppendChild(заявкаузел);
            }
            корень.AppendChild(заявкиЭлемент);
            
            doc.Save(путьКФайлу);
        }
        
        private void ДобавитьЭлемент(XmlElement родитель, string имя, string значение)
        {
            XmlElement элемент = родитель.OwnerDocument.CreateElement(имя);
            элемент.InnerText = значение;
            родитель.AppendChild(элемент);
        }

        public List<Автомобиль> ПолучитьАвтомобилиВНаличии()
        {
            return автомобили.Where(a => a.ВНаличии).ToList();
        }

        public void ДобавитьАвтомобиль(Автомобиль новыйАвто)
        {
            новыйАвто.Ид = следующийИдАвто++;
            автомобили.Add(новыйАвто);
            СохранитьДанные();
        }

        public void УдалитьАвтомобиль(int номерАвто)
        {
            var авто = автомобили.FirstOrDefault(a => a.Ид == номерАвто);
            if (авто != null) { автомобили.Remove(авто); СохранитьДанные(); }
        }

        public bool ЕстьЛиАвтомобильВНаличии(string марка)
        {
            return автомобили.Any(a => a.Марка == марка && a.ВНаличии);
        }

        public Клиент НайтиКлиентаПоТелефону(string телефон)
        {
            return клиенты.FirstOrDefault(c => c.Телефон == телефон);
        }

        public void ДобавитьКлиента(Клиент новыйКлиент)
        {
            новыйКлиент.Ид = следующийИдКлиента++;
            клиенты.Add(новыйКлиент);
            СохранитьДанные();
        }

        public Клиент ПолучитьКлиентаПоИд(int номерКлиента)
        {
            return клиенты.FirstOrDefault(c => c.Ид == номерКлиента);
        }

        public void ДобавитьЗаявку(Заявка новаяЗаявка)
        {
            новаяЗаявка.Ид = следующийИдЗаявки++;
            заявки.Add(новаяЗаявка);
            СохранитьДанные();
        }

        public List<Заявка> ПолучитьОткрытыеЗаявкиПоМарке(string марка)
        {
            return заявки.Where(z => z.Статус == "открыта" && z.ЖелаемаяМарка == марка).ToList();
        }

        public void ИзменитьСтатусЗаявки(int номерЗаявки, string новыйСтатус)
        {
            var заявка = заявки.FirstOrDefault(z => z.Ид == номерЗаявки);
            if (заявка != null) { заявка.Статус = новыйСтатус; СохранитьДанные(); }
        }
    }
}