۸

پروژه کنسولی: سیستم مدیریت کتابخانه 📚💻

وقتشه همه مفاهیم C# که یاد گرفتیم رو در یک پروژه واقعی به کار ببریم!

🎯 مروری بر پروژه

در این درس، یک سیستم مدیریت کتابخانه کامل می‌سازیم که تمام مفاهیم آموخته شده را در یک پروژه عملی ترکیب می‌کند. این پروژه شامل این ویژگی‌ها است:

📚 مدیریت کتاب‌ها

  • اضافه کردن کتاب جدید با اطلاعات کامل
  • نمایش فهرست کتاب‌ها با فیلتر وضعیت
  • جستجوی پیشرفته بر اساس عنوان، نویسنده و ISBN
  • ویرایش و حذف کتاب‌ها

👥 مدیریت اعضا

  • ثبت عضو جدید با اعتبارسنجی ایمیل
  • نمایش فهرست اعضا با جزئیات امانت
  • پیگیری تاریخچه امانت‌های هر عضو
  • مدیریت اطلاعات شخصی اعضا

🔄 امانت و بازگشت

  • امانت دادن کتاب با ثبت تاریخ
  • بازگشت کتاب و محاسبه مدت امانت
  • کنترل موجودی و محدودیت امانت
  • مدیریت صف انتظار برای کتاب‌های پرطرفدار

💾 ذخیره‌سازی و گزارش

  • ذخیره خودکار در فایل‌های JSON
  • بارگذاری داده‌ها هنگام شروع برنامه
  • Exception Handling کامل
  • تولید گزارش‌های آماری

🏗️ معماری پروژه

این پروژه از معماری سه لایه استفاده می‌کند:

📊

Data Layer

کلاس‌های Book و Member

⚙️

Business Layer

کلاس LibraryManager

🖥️

Presentation Layer

کلاس Program و Console UI

💻 پیاده‌سازی کد

کد کامل سیستم مدیریت کتابخانه در C#. سعی کن اول خودت بنویسیش و بعد با این مقایسه کنی!

📋 ساختار کلاس‌ها

هر کلاس مسئولیت خاص خودش رو داره و از اصول OOP پیروی می‌کنه. بیایید با کلاس Book شروع کنیم:

Book.cs - کلاس کتاب
using System;
using System.ComponentModel.DataAnnotations;

public class Book
{
    // Properties اصلی کتاب
    public int Id { get; set; }
    
    [Required(ErrorMessage = "عنوان کتاب الزامی است")]
    [StringLength(200, ErrorMessage = "عنوان نباید بیش از 200 کاراکتر باشد")]
    public string Title { get; set; }
    
    [Required(ErrorMessage = "نام نویسنده الزامی است")]
    [StringLength(100, ErrorMessage = "نام نویسنده نباید بیش از 100 کاراکتر باشد")]
    public string Author { get; set; }
    
    [Required(ErrorMessage = "ISBN الزامی است")]
    [RegularExpression(@"^\d{10}(\d{3})?$", ErrorMessage = "فرمت ISBN نامعتبر است")]
    public string ISBN { get; set; }
    
    public string Category { get; set; }
    public int PublicationYear { get; set; }
    public int PageCount { get; set; }
    public string Publisher { get; set; }
    
    // Properties مربوط به امانت
    public bool IsAvailable { get; set; }
    public DateTime? BorrowDate { get; set; }
    public DateTime? DueDate { get; set; }
    public int? BorrowedByMemberId { get; set; }
    public int BorrowCount { get; set; } // تعداد دفعات امانت
    
    // Constructor
    public Book(int id, string title, string author, string isbn, 
                string category = "", int publicationYear = 0, 
                int pageCount = 0, string publisher = "")
    {
        Id = id;
        Title = title;
        Author = author;
        ISBN = isbn;
        Category = category;
        PublicationYear = publicationYear;
        PageCount = pageCount;
        Publisher = publisher;
        IsAvailable = true;
        BorrowDate = null;
        DueDate = null;
        BorrowedByMemberId = null;
        BorrowCount = 0;
    }
    
    // متد برای امانت دادن کتاب
    public void BorrowBook(int memberId, int borrowDays = 14)
    {
        if (!IsAvailable)
            throw new InvalidOperationException("این کتاب در حال حاضر امانتی است");
            
        IsAvailable = false;
        BorrowDate = DateTime.Now;
        DueDate = DateTime.Now.AddDays(borrowDays);
        BorrowedByMemberId = memberId;
        BorrowCount++;
    }
    
    // متد برای بازگشت کتاب
    public int ReturnBook()
    {
        if (IsAvailable)
            throw new InvalidOperationException("این کتاب امانتی نیست");
            
        IsAvailable = true;
        int daysLate = 0;
        
        if (DueDate.HasValue && DateTime.Now > DueDate.Value)
        {
            daysLate = (DateTime.Now - DueDate.Value).Days;
        }
        
        BorrowDate = null;
        DueDate = null;
        BorrowedByMemberId = null;
        
        return daysLate; // برمی‌گرداند تعداد روزهای تأخیر
    }
    
    // متد برای بررسی تأخیر
    public bool IsOverdue()
    {
        return !IsAvailable && DueDate.HasValue && DateTime.Now > DueDate.Value;
    }
    
    // متد برای محاسبه جریمه
    public decimal CalculateFine(decimal finePerDay = 1000)
    {
        if (!IsOverdue()) return 0;
        
        int daysLate = (DateTime.Now - DueDate.Value).Days;
        return daysLate * finePerDay;
    }

    public override string ToString()
    {
        string status = IsAvailable ? "✅ موجود" : 
                       IsOverdue() ? $"❌ امانتی (تأخیر {(DateTime.Now - DueDate.Value).Days} روز)" :
                       $"📖 امانتی (تا {DueDate:yyyy/MM/dd})";
                       
        return $"[{Id}] {Title}\n" +
               $"   نویسنده: {Author} | دسته: {Category}\n" +
               $"   ISBN: {ISBN} | وضعیت: {status}\n" +
               $"   تعداد امانت: {BorrowCount} بار";
    }
    
    // متد برای نمایش اطلاعات کامل
    public string GetDetailedInfo()
    {
        return $"📚 اطلاعات کامل کتاب:\n" +
               $"   شناسه: {Id}\n" +
               $"   عنوان: {Title}\n" +
               $"   نویسنده: {Author}\n" +
               $"   دسته‌بندی: {Category}\n" +
               $"   سال انتشار: {PublicationYear}\n" +
               $"   تعداد صفحات: {PageCount}\n" +
               $"   ناشر: {Publisher}\n" +
               $"   ISBN: {ISBN}\n" +
               $"   وضعیت: {(IsAvailable ? "موجود" : "امانتی")}\n" +
               $"   تعداد امانت: {BorrowCount} بار";
    }
}
                
Member.cs - کلاس عضو کتابخانه
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Text.RegularExpressions;

public class Member
{
    // Properties اصلی عضو
    public int Id { get; set; }
    
    [Required(ErrorMessage = "نام عضو الزامی است")]
    [StringLength(100, ErrorMessage = "نام نباید بیش از 100 کاراکتر باشد")]
    public string Name { get; set; }
    
    [Required(ErrorMessage = "ایمیل الزامی است")]
    [EmailAddress(ErrorMessage = "فرمت ایمیل نامعتبر است")]
    public string Email { get; set; }
    
    [Phone(ErrorMessage = "فرمت شماره تلفن نامعتبر است")]
    public string PhoneNumber { get; set; }
    
    public string Address { get; set; }
    public DateTime JoinDate { get; set; }
    public DateTime? LastVisit { get; set; }
    
    // Properties مربوط به امانت
    public List BorrowedBooks { get; set; }
    public List BorrowHistory { get; set; } // تاریخچه کامل امانت‌ها
    public int MaxBorrowLimit { get; set; } // حداکثر تعداد کتاب قابل امانت
    public decimal TotalFines { get; set; } // مجموع جریمه‌ها
    public bool IsActive { get; set; } // وضعیت فعال بودن عضویت
    
    // Constructor
    public Member(int id, string name, string email, string phoneNumber = "", string address = "")
    {
        Id = id;
        Name = name;
        Email = email;
        PhoneNumber = phoneNumber;
        Address = address;
        JoinDate = DateTime.Now;
        LastVisit = DateTime.Now;
        BorrowedBooks = new List();
        BorrowHistory = new List();
        MaxBorrowLimit = 3; // پیش‌فرض 3 کتاب
        TotalFines = 0;
        IsActive = true;
    }
    
    // متد برای اعتبارسنجی ایمیل
    public bool IsValidEmail()
    {
        if (string.IsNullOrWhiteSpace(Email))
            return false;
            
        string pattern = @"^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$";
        return Regex.IsMatch(Email, pattern);
    }
    
    // متد برای بررسی امکان امانت کتاب جدید
    public bool CanBorrowBook()
    {
        return IsActive && BorrowedBooks.Count < MaxBorrowLimit && TotalFines == 0;
    }
    
    // متد برای امانت گرفتن کتاب
    public void BorrowBook(int bookId)
    {
        if (!CanBorrowBook())
            throw new InvalidOperationException("امکان امانت کتاب جدید وجود ندارد");
            
        if (BorrowedBooks.Contains(bookId))
            throw new InvalidOperationException("این کتاب قبلاً امانت گرفته شده");
            
        BorrowedBooks.Add(bookId);
        if (!BorrowHistory.Contains(bookId))
            BorrowHistory.Add(bookId);
            
        LastVisit = DateTime.Now;
    }
    
    // متد برای بازگشت کتاب
    public void ReturnBook(int bookId, decimal fine = 0)
    {
        if (!BorrowedBooks.Contains(bookId))
            throw new InvalidOperationException("این کتاب توسط این عضو امانت گرفته نشده");
            
        BorrowedBooks.Remove(bookId);
        TotalFines += fine;
        LastVisit = DateTime.Now;
    }
    
    // متد برای پرداخت جریمه
    public void PayFine(decimal amount)
    {
        if (amount <= 0)
            throw new ArgumentException("مبلغ باید مثبت باشد");
            
        if (amount > TotalFines)
            throw new ArgumentException("مبلغ بیش از جریمه کل است");
            
        TotalFines -= amount;
    }
    
    // متد برای غیرفعال کردن عضویت
    public void DeactivateMembership()
    {
        if (BorrowedBooks.Count > 0)
            throw new InvalidOperationException("ابتدا تمام کتاب‌های امانتی را بازگردانید");
            
        IsActive = false;
    }
    
    // متد برای فعال کردن مجدد عضویت
    public void ReactivateMembership()
    {
        if (TotalFines > 0)
            throw new InvalidOperationException("ابتدا جریمه‌های معوقه را پرداخت کنید");
            
        IsActive = true;
    }
    
    // متد برای محاسبه آمار عضو
    public string GetMemberStats()
    {
        int totalBorrowedBooks = BorrowHistory.Count;
        int currentBorrowedBooks = BorrowedBooks.Count;
        int daysSinceJoin = (DateTime.Now - JoinDate).Days;
        int daysSinceLastVisit = LastVisit.HasValue ? (DateTime.Now - LastVisit.Value).Days : 0;
        
        return $"📊 آمار عضو:\n" +
               $"   کل کتاب‌های امانت گرفته شده: {totalBorrowedBooks}\n" +
               $"   کتاب‌های فعلی امانتی: {currentBorrowedBooks}\n" +
               $"   مدت عضویت: {daysSinceJoin} روز\n" +
               $"   آخرین بازدید: {daysSinceLastVisit} روز پیش\n" +
               $"   جریمه‌های معوقه: {TotalFines:N0} تومان";
    }

    public override string ToString()
    {
        string status = IsActive ? "✅ فعال" : "❌ غیرفعال";
        string fineStatus = TotalFines > 0 ? $" (جریمه: {TotalFines:N0} تومان)" : "";
        
        return $"[{Id}] {Name}\n" +
               $"   ایمیل: {Email} | تلفن: {PhoneNumber}\n" +
               $"   تاریخ عضویت: {JoinDate:yyyy/MM/dd} | وضعیت: {status}{fineStatus}\n" +
               $"   کتاب‌های امانتی: {BorrowedBooks.Count}/{MaxBorrowLimit}";
    }
    
    // متد برای نمایش اطلاعات کامل
    public string GetDetailedInfo()
    {
        return $"👤 اطلاعات کامل عضو:\n" +
               $"   شناسه: {Id}\n" +
               $"   نام: {Name}\n" +
               $"   ایمیل: {Email}\n" +
               $"   تلفن: {PhoneNumber}\n" +
               $"   آدرس: {Address}\n" +
               $"   تاریخ عضویت: {JoinDate:yyyy/MM/dd}\n" +
               $"   آخرین بازدید: {(LastVisit?.ToString("yyyy/MM/dd") ?? "هرگز")}\n" +
               $"   وضعیت: {(IsActive ? "فعال" : "غیرفعال")}\n" +
               $"   حد امانت: {BorrowedBooks.Count}/{MaxBorrowLimit}\n" +
               $"   جریمه‌های معوقه: {TotalFines:N0} تومان\n" +
               $"   تعداد کل امانت‌ها: {BorrowHistory.Count}";
    }
}
                
LibraryManager.cs - کلاس مدیریت کتابخانه
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using Newtonsoft.Json;
using System.Text;

public class LibraryManager
{
    private List books;
    private List members;
    private const string BooksFile = "books.json";
    private const string MembersFile = "members.json";
    private const string LogFile = "library_log.txt";
    private const decimal FinePerDay = 1000; // جریمه روزانه به تومان

    public LibraryManager()
    {
        books = new List();
        members = new List();
        LoadData();
        LogActivity("سیستم مدیریت کتابخانه راه‌اندازی شد");
    }

    #region Data Management
    // بارگذاری داده‌ها از فایل
    private void LoadData()
    {
        try
        {
            if (File.Exists(BooksFile))
            {
                string booksJson = File.ReadAllText(BooksFile, Encoding.UTF8);
                books = JsonConvert.DeserializeObject>(booksJson) ?? new List();
                Console.WriteLine($"✅ {books.Count} کتاب بارگذاری شد");
            }
            else
            {
                Console.WriteLine("⚠️ فایل کتاب‌ها یافت نشد. لیست خالی ایجاد شد.");
            }

            if (File.Exists(MembersFile))
            {
                string membersJson = File.ReadAllText(MembersFile, Encoding.UTF8);
                members = JsonConvert.DeserializeObject>(membersJson) ?? new List();
                Console.WriteLine($"✅ {members.Count} عضو بارگذاری شد");
            }
            else
            {
                Console.WriteLine("⚠️ فایل اعضا یافت نشد. لیست خالی ایجاد شد.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در بارگذاری داده‌ها: {ex.Message}");
            LogActivity($"خطا در بارگذاری: {ex.Message}");
        }
    }

    // ذخیره داده‌ها در فایل
    private void SaveData()
    {
        try
        {
            // ایجاد پشتیبان قبل از ذخیره
            CreateBackup();
            
            string booksJson = JsonConvert.SerializeObject(books, Formatting.Indented);
            File.WriteAllText(BooksFile, booksJson, Encoding.UTF8);

            string membersJson = JsonConvert.SerializeObject(members, Formatting.Indented);
            File.WriteAllText(MembersFile, membersJson, Encoding.UTF8);
            
            Console.WriteLine("💾 داده‌ها با موفقیت ذخیره شد");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در ذخیره داده‌ها: {ex.Message}");
            LogActivity($"خطا در ذخیره: {ex.Message}");
        }
    }
    
    // ایجاد پشتیبان از داده‌ها
    private void CreateBackup()
    {
        try
        {
            string backupDir = "Backup";
            if (!Directory.Exists(backupDir))
                Directory.CreateDirectory(backupDir);
                
            string timestamp = DateTime.Now.ToString("yyyyMMdd_HHmmss");
            
            if (File.Exists(BooksFile))
                File.Copy(BooksFile, Path.Combine(backupDir, $"books_{timestamp}.json"));
                
            if (File.Exists(MembersFile))
                File.Copy(MembersFile, Path.Combine(backupDir, $"members_{timestamp}.json"));
        }
        catch (Exception ex)
        {
            Console.WriteLine($"⚠️ خطا در ایجاد پشتیبان: {ex.Message}");
        }
    }
    
    // ثبت فعالیت در لاگ
    private void LogActivity(string activity)
    {
        try
        {
            string logEntry = $"[{DateTime.Now:yyyy/MM/dd HH:mm:ss}] {activity}";
            File.AppendAllText(LogFile, logEntry + Environment.NewLine, Encoding.UTF8);
        }
        catch
        {
            // در صورت خطا در لاگ، کاری نمی‌کنیم
        }
    }
    #endregion

    #region Book Management
    // اضافه کردن کتاب جدید
    public void AddBook()
    {
        try
        {
            Console.WriteLine("\n📚 اضافه کردن کتاب جدید");
            Console.WriteLine("═══════════════════════════");
            
            Console.Write("عنوان کتاب: ");
            string title = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(title))
            {
                Console.WriteLine("❌ عنوان کتاب نمی‌تواند خالی باشد!");
                return;
            }
            
            Console.Write("نام نویسنده: ");
            string author = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(author))
            {
                Console.WriteLine("❌ نام نویسنده نمی‌تواند خالی باشد!");
                return;
            }
            
            Console.Write("ISBN: ");
            string isbn = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(isbn))
            {
                Console.WriteLine("❌ ISBN نمی‌تواند خالی باشد!");
                return;
            }
            
            // بررسی تکراری نبودن ISBN
            if (books.Any(b => b.ISBN == isbn))
            {
                Console.WriteLine("❌ کتابی با این ISBN قبلاً ثبت شده است!");
                return;
            }
            
            Console.Write("دسته‌بندی (اختیاری): ");
            string category = Console.ReadLine();
            
            Console.Write("سال انتشار (اختیاری): ");
            int.TryParse(Console.ReadLine(), out int year);
            
            Console.Write("تعداد صفحات (اختیاری): ");
            int.TryParse(Console.ReadLine(), out int pages);
            
            Console.Write("ناشر (اختیاری): ");
            string publisher = Console.ReadLine();
            
            int newId = books.Count > 0 ? books.Max(b => b.Id) + 1 : 1;
            Book newBook = new Book(newId, title, author, isbn, category, year, pages, publisher);
            
            books.Add(newBook);
            SaveData();
            
            Console.WriteLine($"\n✅ کتاب '{title}' با موفقیت اضافه شد! (شناسه: {newId})");
            LogActivity($"کتاب جدید اضافه شد: {title} - {author}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در اضافه کردن کتاب: {ex.Message}");
            LogActivity($"خطا در اضافه کردن کتاب: {ex.Message}");
        }
    }
    
    // نمایش همه کتاب‌ها
    public void ShowAllBooks()
    {
        try
        {
            Console.WriteLine("\n📚 فهرست کتاب‌های کتابخانه");
            Console.WriteLine("═══════════════════════════════");
            
            if (books.Count == 0)
            {
                Console.WriteLine("📭 هیچ کتابی در کتابخانه موجود نیست!");
                return;
            }
            
            Console.WriteLine("فیلتر بر اساس وضعیت:");
            Console.WriteLine("1. همه کتاب‌ها");
            Console.WriteLine("2. فقط کتاب‌های موجود");
            Console.WriteLine("3. فقط کتاب‌های امانتی");
            Console.WriteLine("4. فقط کتاب‌های دارای تأخیر");
            Console.Write("انتخاب شما: ");
            
            string choice = Console.ReadLine();
            List filteredBooks = books;
            
            switch (choice)
            {
                case "2":
                    filteredBooks = books.Where(b => b.IsAvailable).ToList();
                    break;
                case "3":
                    filteredBooks = books.Where(b => !b.IsAvailable).ToList();
                    break;
                case "4":
                    filteredBooks = books.Where(b => b.IsOverdue()).ToList();
                    break;
            }
            
            if (filteredBooks.Count == 0)
            {
                Console.WriteLine("📭 با این فیلتر هیچ کتابی یافت نشد!");
                return;
            }
            
            Console.WriteLine($"\n📊 تعداد کتاب‌ها: {filteredBooks.Count}");
            Console.WriteLine("─────────────────────────────────────────────────────────────");
            
            foreach (var book in filteredBooks.OrderBy(b => b.Title))
            {
                Console.WriteLine(book.ToString());
                Console.WriteLine();
            }
            
            LogActivity($"فهرست کتاب‌ها مشاهده شد (فیلتر: {choice})");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در نمایش کتاب‌ها: {ex.Message}");
        }
    }
    
    // جستجوی کتاب
    public void SearchBooks()
    {
        try
        {
            Console.WriteLine("\n🔍 جستجوی کتاب");
            Console.WriteLine("═══════════════════");
            
            if (books.Count == 0)
            {
                Console.WriteLine("📭 هیچ کتابی برای جستجو موجود نیست!");
                return;
            }
            
            Console.WriteLine("جستجو بر اساس:");
            Console.WriteLine("1. عنوان کتاب");
            Console.WriteLine("2. نام نویسنده");
            Console.WriteLine("3. ISBN");
            Console.WriteLine("4. دسته‌بندی");
            Console.WriteLine("5. جستجوی کلی");
            Console.Write("انتخاب شما: ");
            
            string searchType = Console.ReadLine();
            Console.Write("کلمه کلیدی: ");
            string keyword = Console.ReadLine();
            
            if (string.IsNullOrWhiteSpace(keyword))
            {
                Console.WriteLine("❌ کلمه کلیدی نمی‌تواند خالی باشد!");
                return;
            }
            
            List results = new List();
            
            switch (searchType)
            {
                case "1":
                    results = books.Where(b => b.Title.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
                    break;
                case "2":
                    results = books.Where(b => b.Author.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
                    break;
                case "3":
                    results = books.Where(b => b.ISBN.Contains(keyword)).ToList();
                    break;
                case "4":
                    results = books.Where(b => b.Category.Contains(keyword, StringComparison.OrdinalIgnoreCase)).ToList();
                    break;
                case "5":
                    results = books.Where(b => 
                        b.Title.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
                        b.Author.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
                        b.Category.Contains(keyword, StringComparison.OrdinalIgnoreCase) ||
                        b.Publisher.Contains(keyword, StringComparison.OrdinalIgnoreCase)
                    ).ToList();
                    break;
                default:
                    Console.WriteLine("❌ انتخاب نامعتبر!");
                    return;
            }
            
            Console.WriteLine($"\n📊 {results.Count} کتاب یافت شد:");
            Console.WriteLine("─────────────────────────────────────────────────────────────");
            
            if (results.Count == 0)
            {
                Console.WriteLine("📭 هیچ کتابی با این مشخصات یافت نشد!");
            }
            else
            {
                foreach (var book in results)
                {
                    Console.WriteLine(book.ToString());
                    Console.WriteLine();
                }
            }
            
            LogActivity($"جستجو انجام شد: {keyword} ({results.Count} نتیجه)");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در جستجو: {ex.Message}");
        }
    }
    #endregion

    #region Member Management
    // اضافه کردن عضو جدید
    public void AddMember()
    {
        try
        {
            Console.WriteLine("\n👤 اضافه کردن عضو جدید");
            Console.WriteLine("═══════════════════════════");
            
            Console.Write("نام و نام خانوادگی: ");
            string name = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(name))
            {
                Console.WriteLine("❌ نام نمی‌تواند خالی باشد!");
                return;
            }
            
            Console.Write("ایمیل: ");
            string email = Console.ReadLine();
            if (string.IsNullOrWhiteSpace(email) || !Member.IsValidEmail(email))
            {
                Console.WriteLine("❌ ایمیل معتبر وارد کنید!");
                return;
            }
            
            // بررسی تکراری نبودن ایمیل
            if (members.Any(m => m.Email.Equals(email, StringComparison.OrdinalIgnoreCase)))
            {
                Console.WriteLine("❌ عضوی با این ایمیل قبلاً ثبت شده است!");
                return;
            }
            
            Console.Write("شماره تلفن (اختیاری): ");
            string phone = Console.ReadLine();
            
            Console.Write("آدرس (اختیاری): ");
            string address = Console.ReadLine();
            
            int newId = members.Count > 0 ? members.Max(m => m.Id) + 1 : 1;
            Member newMember = new Member(newId, name, email, phone, address);
            
            members.Add(newMember);
            SaveData();
            
            Console.WriteLine($"\n✅ عضو '{name}' با موفقیت اضافه شد! (شناسه: {newId})");
            LogActivity($"عضو جدید اضافه شد: {name} - {email}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در اضافه کردن عضو: {ex.Message}");
            LogActivity($"خطا در اضافه کردن عضو: {ex.Message}");
        }
    }
    
    // نمایش همه اعضا
    public void ShowAllMembers()
    {
        try
        {
            Console.WriteLine("\n👥 فهرست اعضای کتابخانه");
            Console.WriteLine("═══════════════════════════════");
            
            if (members.Count == 0)
            {
                Console.WriteLine("📭 هیچ عضوی در کتابخانه ثبت نشده است!");
                return;
            }
            
            Console.WriteLine("فیلتر بر اساس وضعیت:");
            Console.WriteLine("1. همه اعضا");
            Console.WriteLine("2. فقط اعضای فعال");
            Console.WriteLine("3. فقط اعضای غیرفعال");
            Console.WriteLine("4. اعضای دارای کتاب امانتی");
            Console.WriteLine("5. اعضای دارای جریمه");
            Console.Write("انتخاب شما: ");
            
            string choice = Console.ReadLine();
            List filteredMembers = members;
            
            switch (choice)
            {
                case "2":
                    filteredMembers = members.Where(m => m.IsActive).ToList();
                    break;
                case "3":
                    filteredMembers = members.Where(m => !m.IsActive).ToList();
                    break;
                case "4":
                    filteredMembers = members.Where(m => m.BorrowedBooks.Count > 0).ToList();
                    break;
                case "5":
                    filteredMembers = members.Where(m => m.TotalFines > 0).ToList();
                    break;
            }
            
            if (filteredMembers.Count == 0)
            {
                Console.WriteLine("📭 با این فیلتر هیچ عضوی یافت نشد!");
                return;
            }
            
            Console.WriteLine($"\n📊 تعداد اعضا: {filteredMembers.Count}");
            Console.WriteLine("─────────────────────────────────────────────────────────────");
            
            foreach (var member in filteredMembers.OrderBy(m => m.Name))
            {
                Console.WriteLine(member.ToString());
                Console.WriteLine();
            }
            
            LogActivity($"فهرست اعضا مشاهده شد (فیلتر: {choice})");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در نمایش اعضا: {ex.Message}");
        }
    }
    #endregion

    #region Borrowing Management
    // امانت دادن کتاب
    public void BorrowBook()
    {
        try
        {
            Console.WriteLine("\n📖 امانت دادن کتاب");
            Console.WriteLine("═══════════════════════");
            
            if (books.Count == 0)
            {
                Console.WriteLine("📭 هیچ کتابی در کتابخانه موجود نیست!");
                return;
            }
            
            if (members.Count == 0)
            {
                Console.WriteLine("📭 هیچ عضوی در کتابخانه ثبت نشده است!");
                return;
            }
            
            Console.Write("شناسه کتاب: ");
            if (!int.TryParse(Console.ReadLine(), out int bookId))
            {
                Console.WriteLine("❌ شناسه کتاب معتبر وارد کنید!");
                return;
            }
            
            Book book = books.FirstOrDefault(b => b.Id == bookId);
            if (book == null)
            {
                Console.WriteLine("❌ کتابی با این شناسه یافت نشد!");
                return;
            }
            
            if (!book.IsAvailable)
            {
                Console.WriteLine($"❌ این کتاب در حال حاضر در اختیار عضو شناسه {book.BorrowedByMemberId} است!");
                return;
            }
            
            Console.Write("شناسه عضو: ");
            if (!int.TryParse(Console.ReadLine(), out int memberId))
            {
                Console.WriteLine("❌ شناسه عضو معتبر وارد کنید!");
                return;
            }
            
            Member member = members.FirstOrDefault(m => m.Id == memberId);
            if (member == null)
            {
                Console.WriteLine("❌ عضوی با این شناسه یافت نشد!");
                return;
            }
            
            if (!member.IsActive)
            {
                Console.WriteLine("❌ این عضو غیرفعال است و نمی‌تواند کتاب امانت بگیرد!");
                return;
            }
            
            if (!member.CanBorrowBook())
            {
                Console.WriteLine($"❌ این عضو نمی‌تواند کتاب جدید امانت بگیرد! (حداکثر: {member.MaxBorrowLimit})");
                return;
            }
            
            if (member.TotalFines > 0)
            {
                Console.WriteLine($"⚠️ این عضو {member.TotalFines:N0} تومان جریمه دارد!");
                Console.Write("آیا می‌خواهید ادامه دهید؟ (y/n): ");
                if (Console.ReadLine()?.ToLower() != "y")
                    return;
            }
            
            // امانت دادن کتاب
            book.BorrowBook(memberId);
            member.BorrowBook(bookId);
            
            SaveData();
            
            Console.WriteLine($"\n✅ کتاب '{book.Title}' با موفقیت به '{member.Name}' امانت داده شد!");
            Console.WriteLine($"📅 تاریخ بازگشت: {book.DueDate:yyyy/MM/dd}");
            
            LogActivity($"امانت کتاب: {book.Title} به {member.Name}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در امانت دادن کتاب: {ex.Message}");
            LogActivity($"خطا در امانت: {ex.Message}");
        }
    }
    
    // بازگرداندن کتاب
    public void ReturnBook()
    {
        try
        {
            Console.WriteLine("\n📚 بازگرداندن کتاب");
            Console.WriteLine("═══════════════════════");
            
            Console.Write("شناسه کتاب: ");
            if (!int.TryParse(Console.ReadLine(), out int bookId))
            {
                Console.WriteLine("❌ شناسه کتاب معتبر وارد کنید!");
                return;
            }
            
            Book book = books.FirstOrDefault(b => b.Id == bookId);
            if (book == null)
            {
                Console.WriteLine("❌ کتابی با این شناسه یافت نشد!");
                return;
            }
            
            if (book.IsAvailable)
            {
                Console.WriteLine("❌ این کتاب امانت داده نشده است!");
                return;
            }
            
            Member member = members.FirstOrDefault(m => m.Id == book.BorrowedByMemberId);
            if (member == null)
            {
                Console.WriteLine("❌ عضو امانت‌گیرنده یافت نشد!");
                return;
            }
            
            // محاسبه جریمه در صورت تأخیر
            decimal fine = 0;
            if (book.IsOverdue())
            {
                fine = book.CalculateFine(FinePerDay);
                Console.WriteLine($"⚠️ این کتاب {(DateTime.Now - book.DueDate).Days} روز تأخیر دارد!");
                Console.WriteLine($"💰 جریمه: {fine:N0} تومان");
                
                member.TotalFines += fine;
            }
            
            // بازگرداندن کتاب
            book.ReturnBook();
            member.ReturnBook(bookId);
            
            SaveData();
            
            Console.WriteLine($"\n✅ کتاب '{book.Title}' با موفقیت بازگردانده شد!");
            if (fine > 0)
            {
                Console.WriteLine($"💰 جریمه {fine:N0} تومان به حساب '{member.Name}' اضافه شد.");
            }
            
            LogActivity($"بازگشت کتاب: {book.Title} از {member.Name} (جریمه: {fine:N0})");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در بازگرداندن کتاب: {ex.Message}");
            LogActivity($"خطا در بازگشت: {ex.Message}");
        }
    }
    #endregion

    #region Reports and Statistics
    // گزارش کامل کتابخانه
    public void ShowLibraryReport()
    {
        try
        {
            Console.WriteLine("\n📊 گزارش کامل کتابخانه");
            Console.WriteLine("═══════════════════════════════");
            
            // آمار کلی کتاب‌ها
            int totalBooks = books.Count;
            int availableBooks = books.Count(b => b.IsAvailable);
            int borrowedBooks = books.Count(b => !b.IsAvailable);
            int overdueBooks = books.Count(b => b.IsOverdue());
            
            Console.WriteLine("📚 آمار کتاب‌ها:");
            Console.WriteLine($"   • کل کتاب‌ها: {totalBooks}");
            Console.WriteLine($"   • کتاب‌های موجود: {availableBooks}");
            Console.WriteLine($"   • کتاب‌های امانتی: {borrowedBooks}");
            Console.WriteLine($"   • کتاب‌های دارای تأخیر: {overdueBooks}");
            
            // آمار اعضا
            int totalMembers = members.Count;
            int activeMembers = members.Count(m => m.IsActive);
            int membersWithBooks = members.Count(m => m.BorrowedBooks.Count > 0);
            int membersWithFines = members.Count(m => m.TotalFines > 0);
            decimal totalFines = members.Sum(m => m.TotalFines);
            
            Console.WriteLine("\n👥 آمار اعضا:");
            Console.WriteLine($"   • کل اعضا: {totalMembers}");
            Console.WriteLine($"   • اعضای فعال: {activeMembers}");
            Console.WriteLine($"   • اعضای دارای کتاب: {membersWithBooks}");
            Console.WriteLine($"   • اعضای دارای جریمه: {membersWithFines}");
            Console.WriteLine($"   • کل جریمه‌ها: {totalFines:N0} تومان");
            
            // محبوب‌ترین دسته‌بندی‌ها
            var categoryStats = books
                .Where(b => !string.IsNullOrEmpty(b.Category))
                .GroupBy(b => b.Category)
                .Select(g => new { Category = g.Key, Count = g.Count() })
                .OrderByDescending(x => x.Count)
                .Take(5);
            
            Console.WriteLine("\n📈 محبوب‌ترین دسته‌بندی‌ها:");
            foreach (var cat in categoryStats)
            {
                Console.WriteLine($"   • {cat.Category}: {cat.Count} کتاب");
            }
            
            // کتاب‌های پرامانت
            var popularBooks = books
                .Where(b => b.BorrowCount > 0)
                .OrderByDescending(b => b.BorrowCount)
                .Take(5);
            
            Console.WriteLine("\n🏆 کتاب‌های پرامانت:");
            foreach (var book in popularBooks)
            {
                Console.WriteLine($"   • {book.Title} ({book.BorrowCount} بار)");
            }
            
            LogActivity("گزارش کامل کتابخانه مشاهده شد");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در تولید گزارش: {ex.Message}");
        }
    }
    
    // نمایش کتاب‌های دارای تأخیر
    public void ShowOverdueBooks()
    {
        try
        {
            Console.WriteLine("\n⏰ کتاب‌های دارای تأخیر");
            Console.WriteLine("═══════════════════════════════");
            
            var overdueBooks = books.Where(b => b.IsOverdue()).ToList();
            
            if (overdueBooks.Count == 0)
            {
                Console.WriteLine("✅ هیچ کتاب دارای تأخیری وجود ندارد!");
                return;
            }
            
            Console.WriteLine($"📊 تعداد کتاب‌های دارای تأخیر: {overdueBooks.Count}");
            Console.WriteLine("─────────────────────────────────────────────────────────────");
            
            foreach (var book in overdueBooks.OrderBy(b => b.DueDate))
            {
                var member = members.FirstOrDefault(m => m.Id == book.BorrowedByMemberId);
                int daysOverdue = (DateTime.Now - book.DueDate).Days;
                decimal fine = book.CalculateFine(FinePerDay);
                
                Console.WriteLine($"📖 {book.Title}");
                Console.WriteLine($"   👤 امانت‌گیرنده: {member?.Name ?? "نامشخص"}");
                Console.WriteLine($"   📅 تاریخ بازگشت: {book.DueDate:yyyy/MM/dd}");
                Console.WriteLine($"   ⏰ تأخیر: {daysOverdue} روز");
                Console.WriteLine($"   💰 جریمه: {fine:N0} تومان");
                Console.WriteLine();
            }
            
            LogActivity($"فهرست کتاب‌های دارای تأخیر مشاهده شد ({overdueBooks.Count} کتاب)");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در نمایش کتاب‌های دارای تأخیر: {ex.Message}");
        }
    }
    #endregion
}
Program.cs
using System;
using System.IO;

class Program
{
    static LibraryManager library = new LibraryManager();
    
    static void Main(string[] args)
    {
        try
        {
            Console.OutputEncoding = System.Text.Encoding.UTF8;
            Console.Title = "سیستم مدیریت کتابخانه";
            
            ShowWelcomeMessage();
            
            bool running = true;
            while (running)
            {
                try
                {
                    ShowMainMenu();
                    string choice = Console.ReadLine()?.Trim();
                    
                    switch (choice)
                    {
                        case "1":
                            BookManagementMenu();
                            break;
                        case "2":
                            MemberManagementMenu();
                            break;
                        case "3":
                            BorrowingMenu();
                            break;
                        case "4":
                            ReportsMenu();
                            break;
                        case "5":
                            SystemMenu();
                            break;
                        case "0":
                            running = false;
                            ShowGoodbyeMessage();
                            break;
                        default:
                            Console.WriteLine("❌ گزینه نامعتبر! لطفاً دوباره تلاش کنید.");
                            break;
                    }
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"❌ خطا: {ex.Message}");
                }
                
                if (running)
                {
                    Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                    Console.ReadLine();
                    Console.Clear();
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطای سیستمی: {ex.Message}");
            Console.WriteLine("برای خروج Enter بزنید...");
            Console.ReadLine();
        }
    }
    
    static void ShowWelcomeMessage()
    {
        Console.Clear();
        Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
        Console.WriteLine("║                    🏛️ سیستم مدیریت کتابخانه                    ║");
        Console.WriteLine("║                      نسخه پیشرفته 2.0                        ║");
        Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
        Console.WriteLine();
        Console.WriteLine("📚 خوش آمدید! سیستم در حال بارگذاری...");
        
        // شبیه‌سازی بارگذاری
        for (int i = 0; i <= 100; i += 20)
        {
            Console.Write($"\r⏳ بارگذاری: {i}%");
            System.Threading.Thread.Sleep(300);
        }
        
        Console.WriteLine("\n✅ سیستم آماده است!");
        Console.WriteLine("\nبرای ادامه Enter بزنید...");
        Console.ReadLine();
        Console.Clear();
    }
    
    static void ShowMainMenu()
    {
        Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
        Console.WriteLine("║                        📋 منوی اصلی                          ║");
        Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
        Console.WriteLine("║  1️⃣  📚 مدیریت کتاب‌ها                                        ║");
        Console.WriteLine("║  2️⃣  👥 مدیریت اعضا                                          ║");
        Console.WriteLine("║  3️⃣  🔄 امانت و بازگشت                                       ║");
        Console.WriteLine("║  4️⃣  📊 گزارش‌ها و آمار                                       ║");
        Console.WriteLine("║  5️⃣  ⚙️  تنظیمات سیستم                                        ║");
        Console.WriteLine("║  0️⃣  🚪 خروج                                                  ║");
        Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
        Console.Write("🎯 انتخاب شما: ");
    }
    
    static void BookManagementMenu()
    {
        bool back = false;
        while (!back)
        {
            Console.Clear();
            Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                      📚 مدیریت کتاب‌ها                        ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
            Console.WriteLine("║  1️⃣  ➕ اضافه کردن کتاب جدید                                  ║");
            Console.WriteLine("║  2️⃣  📋 نمایش همه کتاب‌ها                                     ║");
            Console.WriteLine("║  3️⃣  🔍 جستجوی کتاب                                          ║");
            Console.WriteLine("║  4️⃣  ✏️  ویرایش کتاب                                          ║");
            Console.WriteLine("║  5️⃣  🗑️  حذف کتاب                                            ║");
            Console.WriteLine("║  0️⃣  🔙 بازگشت به منوی اصلی                                   ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
            Console.Write("🎯 انتخاب شما: ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    library.AddBook();
                    break;
                case "2":
                    ShowBooksSubMenu();
                    break;
                case "3":
                    library.SearchBooks();
                    break;
                case "4":
                    EditBook();
                    break;
                case "5":
                    DeleteBook();
                    break;
                case "0":
                    back = true;
                    break;
                default:
                    Console.WriteLine("❌ گزینه نامعتبر!");
                    break;
            }
            
            if (!back)
            {
                Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                Console.ReadLine();
            }
        }
    }
    
    static void ShowBooksSubMenu()
    {
        Console.WriteLine("\n📚 نوع نمایش را انتخاب کنید:");
        Console.WriteLine("1. همه کتاب‌ها");
        Console.WriteLine("2. کتاب‌های موجود");
        Console.WriteLine("3. کتاب‌های امانت داده شده");
        Console.WriteLine("4. کتاب‌های معوقه");
        Console.Write("انتخاب: ");
        
        string choice = Console.ReadLine()?.Trim();
        
        switch (choice)
        {
            case "1":
                library.ShowAllBooks("all");
                break;
            case "2":
                library.ShowAllBooks("available");
                break;
            case "3":
                library.ShowAllBooks("borrowed");
                break;
            case "4":
                library.ShowAllBooks("overdue");
                break;
            default:
                library.ShowAllBooks("all");
                break;
        }
    }
    
    static void MemberManagementMenu()
    {
        bool back = false;
        while (!back)
        {
            Console.Clear();
            Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                       👥 مدیریت اعضا                         ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
            Console.WriteLine("║  1️⃣  ➕ اضافه کردن عضو جدید                                   ║");
            Console.WriteLine("║  2️⃣  📋 نمایش همه اعضا                                        ║");
            Console.WriteLine("║  3️⃣  ✏️  ویرایش اطلاعات عضو                                   ║");
            Console.WriteLine("║  4️⃣  💰 مدیریت جریمه‌ها                                        ║");
            Console.WriteLine("║  5️⃣  📊 جزئیات عضو                                           ║");
            Console.WriteLine("║  0️⃣  🔙 بازگشت به منوی اصلی                                   ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
            Console.Write("🎯 انتخاب شما: ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    library.AddMember();
                    break;
                case "2":
                    ShowMembersSubMenu();
                    break;
                case "3":
                    EditMember();
                    break;
                case "4":
                    ManageFines();
                    break;
                case "5":
                    ShowMemberDetails();
                    break;
                case "0":
                    back = true;
                    break;
                default:
                    Console.WriteLine("❌ گزینه نامعتبر!");
                    break;
            }
            
            if (!back)
            {
                Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                Console.ReadLine();
            }
        }
    }
    
    static void ShowMembersSubMenu()
    {
        Console.WriteLine("\n👥 نوع نمایش را انتخاب کنید:");
        Console.WriteLine("1. همه اعضا");
        Console.WriteLine("2. اعضای فعال");
        Console.WriteLine("3. اعضای غیرفعال");
        Console.WriteLine("4. اعضا با کتاب امانتی");
        Console.WriteLine("5. اعضا با جریمه");
        Console.Write("انتخاب: ");
        
        string choice = Console.ReadLine()?.Trim();
        
        switch (choice)
        {
            case "1":
                library.ShowAllMembers("all");
                break;
            case "2":
                library.ShowAllMembers("active");
                break;
            case "3":
                library.ShowAllMembers("inactive");
                break;
            case "4":
                library.ShowAllMembers("with_books");
                break;
            case "5":
                library.ShowAllMembers("with_fines");
                break;
            default:
                library.ShowAllMembers("all");
                break;
        }
    }
    
    static void BorrowingMenu()
    {
        bool back = false;
        while (!back)
        {
            Console.Clear();
            Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                     🔄 امانت و بازگشت                        ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
            Console.WriteLine("║  1️⃣  📤 امانت دادن کتاب                                       ║");
            Console.WriteLine("║  2️⃣  📥 بازگشت کتاب                                          ║");
            Console.WriteLine("║  3️⃣  ⏰ کتاب‌های معوقه                                        ║");
            Console.WriteLine("║  4️⃣  📋 تاریخچه امانت                                        ║");
            Console.WriteLine("║  0️⃣  🔙 بازگشت به منوی اصلی                                   ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
            Console.Write("🎯 انتخاب شما: ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    library.BorrowBook();
                    break;
                case "2":
                    library.ReturnBook();
                    break;
                case "3":
                    library.ShowOverdueBooks();
                    break;
                case "4":
                    ShowBorrowHistory();
                    break;
                case "0":
                    back = true;
                    break;
                default:
                    Console.WriteLine("❌ گزینه نامعتبر!");
                    break;
            }
            
            if (!back)
            {
                Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                Console.ReadLine();
            }
        }
    }
    
    static void ReportsMenu()
    {
        bool back = false;
        while (!back)
        {
            Console.Clear();
            Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                      📊 گزارش‌ها و آمار                       ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
            Console.WriteLine("║  1️⃣  📈 گزارش کلی کتابخانه                                    ║");
            Console.WriteLine("║  2️⃣  📚 جزئیات کتاب                                          ║");
            Console.WriteLine("║  3️⃣  👤 جزئیات عضو                                           ║");
            Console.WriteLine("║  4️⃣  💰 گزارش جریمه‌ها                                        ║");
            Console.WriteLine("║  5️⃣  📋 آمار امانت                                           ║");
            Console.WriteLine("║  0️⃣  🔙 بازگشت به منوی اصلی                                   ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
            Console.Write("🎯 انتخاب شما: ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    library.ShowLibraryReport();
                    break;
                case "2":
                    ShowBookDetails();
                    break;
                case "3":
                    ShowMemberDetails();
                    break;
                case "4":
                    ShowFinesReport();
                    break;
                case "5":
                    ShowBorrowingStats();
                    break;
                case "0":
                    back = true;
                    break;
                default:
                    Console.WriteLine("❌ گزینه نامعتبر!");
                    break;
            }
            
            if (!back)
            {
                Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                Console.ReadLine();
            }
        }
    }
    
    static void SystemMenu()
    {
        bool back = false;
        while (!back)
        {
            Console.Clear();
            Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
            Console.WriteLine("║                      ⚙️ تنظیمات سیستم                        ║");
            Console.WriteLine("╠══════════════════════════════════════════════════════════════╣");
            Console.WriteLine("║  1️⃣  💾 پشتیبان‌گیری دستی                                    ║");
            Console.WriteLine("║  2️⃣  📂 مشاهده فایل‌های سیستم                                 ║");
            Console.WriteLine("║  3️⃣  🔧 تنظیمات جریمه                                        ║");
            Console.WriteLine("║  4️⃣  📊 اطلاعات سیستم                                        ║");
            Console.WriteLine("║  5️⃣  🗂️  مشاهده لاگ‌ها                                        ║");
            Console.WriteLine("║  0️⃣  🔙 بازگشت به منوی اصلی                                   ║");
            Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
            Console.Write("🎯 انتخاب شما: ");
            
            string choice = Console.ReadLine()?.Trim();
            
            switch (choice)
            {
                case "1":
                    CreateManualBackup();
                    break;
                case "2":
                    ShowSystemFiles();
                    break;
                case "3":
                    ConfigureFineSettings();
                    break;
                case "4":
                    ShowSystemInfo();
                    break;
                case "5":
                    ShowLogs();
                    break;
                case "0":
                    back = true;
                    break;
                default:
                    Console.WriteLine("❌ گزینه نامعتبر!");
                    break;
            }
            
            if (!back)
            {
                Console.WriteLine("\n📌 برای ادامه Enter بزنید...");
                Console.ReadLine();
            }
        }
    }
    
    static void ShowGoodbyeMessage()
    {
        Console.Clear();
        Console.WriteLine("╔══════════════════════════════════════════════════════════════╗");
        Console.WriteLine("║                        👋 خداحافظ!                          ║");
        Console.WriteLine("║                                                              ║");
        Console.WriteLine("║              از استفاده از سیستم متشکریم! 🙏                ║");
        Console.WriteLine("║                                                              ║");
        Console.WriteLine("║                    تا دیدار مجدد! 😊                        ║");
        Console.WriteLine("╚══════════════════════════════════════════════════════════════╝");
        
        // ذخیره خودکار قبل از خروج
        Console.WriteLine("\n💾 در حال ذخیره داده‌ها...");
        library.SaveData();
        Console.WriteLine("✅ داده‌ها با موفقیت ذخیره شد!");
        
        Console.WriteLine("\nبرای خروج Enter بزنید...");
        Console.ReadLine();
    }
    
    // متدهای کمکی برای عملکردهای اضافی
    static void EditBook()
    {
        Console.WriteLine("🔧 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void DeleteBook()
    {
        Console.WriteLine("🗑️ این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void EditMember()
    {
        Console.WriteLine("✏️ این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ManageFines()
    {
        Console.WriteLine("💰 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ShowMemberDetails()
    {
        Console.WriteLine("👤 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ShowBorrowHistory()
    {
        Console.WriteLine("📋 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ShowBookDetails()
    {
        Console.WriteLine("📚 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ShowFinesReport()
    {
        Console.WriteLine("💰 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void ShowBorrowingStats()
    {
        Console.WriteLine("📊 این قابلیت در نسخه‌های آینده اضافه خواهد شد.");
    }
    
    static void CreateManualBackup()
    {
        try
        {
            Console.WriteLine("💾 در حال ایجاد پشتیبان...");
            // شبیه‌سازی پشتیبان‌گیری
            string backupName = $"backup_{DateTime.Now:yyyyMMdd_HHmmss}";
            Console.WriteLine($"✅ پشتیبان با نام '{backupName}' ایجاد شد!");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در ایجاد پشتیبان: {ex.Message}");
        }
    }
    
    static void ShowSystemFiles()
    {
        Console.WriteLine("📂 فایل‌های سیستم:");
        Console.WriteLine("• books.json - اطلاعات کتاب‌ها");
        Console.WriteLine("• members.json - اطلاعات اعضا");
        Console.WriteLine("• library.log - لاگ فعالیت‌ها");
        Console.WriteLine("• backups/ - پوشه پشتیبان‌ها");
    }
    
    static void ConfigureFineSettings()
    {
        Console.WriteLine("🔧 تنظیمات جریمه:");
        Console.WriteLine($"• جریمه روزانه: {library.FinePerDay} تومان");
        Console.WriteLine("• برای تغییر این مقدار، کد برنامه را ویرایش کنید.");
    }
    
    static void ShowSystemInfo()
    {
        Console.WriteLine("📊 اطلاعات سیستم:");
        Console.WriteLine($"• نسخه: 2.0");
        Console.WriteLine($"• تاریخ اجرا: {DateTime.Now:yyyy/MM/dd HH:mm:ss}");
        Console.WriteLine($"• سیستم عامل: {Environment.OSVersion}");
        Console.WriteLine($"• مسیر برنامه: {Environment.CurrentDirectory}");
    }
    
    static void ShowLogs()
    {
        try
        {
            string logFile = "library.log";
            if (File.Exists(logFile))
            {
                Console.WriteLine("🗂️ آخرین فعالیت‌ها:");
                string[] lines = File.ReadAllLines(logFile);
                int startIndex = Math.Max(0, lines.Length - 10);
                
                for (int i = startIndex; i < lines.Length; i++)
                {
                    Console.WriteLine($"• {lines[i]}");
                }
            }
            else
            {
                Console.WriteLine("📝 هنوز فعالیتی ثبت نشده است.");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"❌ خطا در خواندن لاگ: {ex.Message}");
        }
    }
}
                

💪 تمرین‌های پیشرفته: توسعه سیستم مدیریت کتابخانه

🎯 تمرین 1: سیستم رزرو کتاب

هدف: اضافه کردن قابلیت رزرو کتاب‌های امانت داده شده

  • ایجاد کلاس BookReservation با خصوصیات رزرو
  • اضافه کردن صف انتظار برای هر کتاب
  • اطلاع‌رسانی خودکار هنگام آزاد شدن کتاب
  • مدیریت اولویت رزرو بر اساس تاریخ درخواست

💡 راهنمایی:

  • از Queue<BookReservation> برای صف انتظار استفاده کنید
  • هنگام بازگشت کتاب، اولین نفر در صف را اطلاع‌رسانی کنید
  • رزرو را با مهلت زمانی محدود کنید (مثلاً 3 روز)

🎯 تمرین 2: سیستم امتیازدهی و پیشنهاد

هدف: اضافه کردن سیستم امتیازدهی و پیشنهاد کتاب

  • امکان امتیازدهی به کتاب‌ها (1 تا 5 ستاره)
  • نظرات و کامنت‌های اعضا
  • پیشنهاد کتاب بر اساس سابقه مطالعه
  • فهرست پرطرفدارترین کتاب‌ها

💡 راهنمایی:

  • کلاس BookRating برای امتیازات ایجاد کنید
  • از الگوریتم‌های ساده برای پیشنهاد استفاده کنید
  • میانگین امتیازات را محاسبه و نمایش دهید

🎯 تمرین 3: گزارش‌گیری پیشرفته و آمار

هدف: ایجاد سیستم گزارش‌گیری جامع

  • گزارش فعالیت روزانه، هفتگی، ماهانه
  • آمار محبوب‌ترین کتاب‌ها و نویسندگان
  • تحلیل رفتار اعضا (فعال‌ترین اعضا، بیشترین تأخیر)
  • پیش‌بینی تقاضا برای کتاب‌های جدید
  • صادرات گزارش‌ها به فرمت‌های مختلف (CSV, PDF)

💡 راهنمایی:

  • از LINQ برای تحلیل داده‌ها استفاده کنید
  • کلاس ReportGenerator برای تولید گزارش‌ها
  • از StringBuilder برای ساخت گزارش‌های متنی
  • الگوی Strategy برای انواع مختلف گزارش

🎯 تمرین 4: سیستم اطلاع‌رسانی و یادآوری

هدف: پیاده‌سازی سیستم اطلاع‌رسانی خودکار

  • یادآوری سررسید امانت (2 روز قبل از انقضا)
  • اطلاع‌رسانی آزاد شدن کتاب رزرو شده
  • اعلان کتاب‌های جدید بر اساس علایق
  • گزارش جریمه‌های معوقه

💡 راهنمایی:

  • از الگوی Observer برای اطلاع‌رسانی استفاده کنید
  • کلاس NotificationService ایجاد کنید
  • از Timer برای بررسی‌های دوره‌ای
  • انواع مختلف اطلاع‌رسانی (ایمیل، SMS، داخلی)

🎯 تمرین 5: بهینه‌سازی و عملکرد

هدف: بهبود عملکرد و مقیاس‌پذیری سیستم

  • پیاده‌سازی Cache برای جستجوهای پرتکرار
  • ایندکس‌گذاری برای جستجوی سریع
  • بارگذاری تنبل (Lazy Loading) برای داده‌های بزرگ
  • پردازش موازی برای عملیات سنگین
  • مدیریت حافظه و منابع

💡 راهنمایی:

  • از Dictionary برای Cache استفاده کنید
  • Task.Run() برای پردازش موازی
  • الگوی Singleton برای مدیریت Cache
  • از using برای مدیریت منابع

🏆 چالش نهایی: سیستم کامل مدیریت کتابخانه

تمام قابلیت‌های بالا را در یک سیستم یکپارچه ترکیب کنید:

  • معماری لایه‌ای (Data, Business, Presentation)
  • الگوهای طراحی مناسب (Repository, Factory, Observer)
  • مدیریت خطا و لاگ‌گیری جامع
  • تست واحد برای بخش‌های مهم
  • رابط کاربری بهتر با منوهای تعاملی
  • پیکربندی سیستم از طریق فایل تنظیمات

📋 معیارهای موفقیت:

  • ✅ سیستم بدون خطا اجرا شود
  • ✅ تمام قابلیت‌ها کامل پیاده‌سازی شده باشند
  • ✅ کد تمیز و قابل نگهداری باشد
  • ✅ عملکرد مناسب با حجم داده بالا
  • ✅ رابط کاربری دوستانه و آسان

🛠️ نکات پیاده‌سازی:

📁 ساختار پروژه:

  • • Models/ - کلاس‌های مدل
  • • Services/ - منطق کسب‌وکار
  • • Data/ - مدیریت داده
  • • Utils/ - ابزارهای کمکی

🔧 ابزارهای مفید:

  • • Newtonsoft.Json برای JSON
  • • System.IO برای فایل‌ها
  • • System.Threading برای Timer
  • • System.Linq برای تحلیل

📊 مدیریت داده:

  • • فایل‌های JSON جداگانه
  • • پشتیبان‌گیری منظم
  • • اعتبارسنجی داده‌ها
  • • مدیریت همزمانی

🎨 رابط کاربری:

  • • منوهای سلسله‌مراتبی
  • • پیام‌های واضح
  • • اعتبارسنجی ورودی
  • • راهنمای کاربر

آفرین! پروژه کنسولی تموم شد! 🎉

شما با موفقیت یک سیستم مدیریت کتابخانه کامل ساختین! حالا برای Windows Forms آماده‌ای؟

درس قبلی
درس ۸ از ۱۶
درس بعدی: مقدمه Windows Forms