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


using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Windows.Forms;
using System.Xml;
using System.Xml.Serialization;
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 ex)
                {
                    MessageBox.Show("Ошибка загрузки данных: " + ex.Message);
                    СоздатьТестовыеДанные();
                }
            }
            else
            {
                СоздатьТестовыеДанные();
            }
            
            // Определяем следующий ID
            следующийИдАвто = автомобили.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 Автомобиль { Ид = 3, Марка = "Лада", Модель = "Веста", ГодВыпуска = 2023, Цена = 18000, ВНаличии = true, ДатаВыпуска = new DateTime(2023, 1, 15) }
            };
            
            клиенты = new List<Клиент>();
            заявки = new List<Заявка>();
            
            следующийИдАвто = 4;
            следующийИдКлиента = 1;
            следующийИдЗаявки = 1;
            
            СохранитьДанные();
        }

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

        // Методы для работы с автомобилями
        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)
            {
                заявка.Статус = новыйСтатус;
                СохранитьДанные();
            }
        }
    }
}