using SQLite; using Phonebook.Models; using System.Collections.ObjectModel; using Contact = Phonebook.Models.Contact; using System.Diagnostics; using System.Globalization; namespace Phonebook.Services { public class DatabaseService { private SQLiteAsyncConnection _database; public DatabaseService() { Initialize(); } private async void Initialize() { if (_database != null) return; _database = new SQLiteAsyncConnection(Path.Combine(FileSystem.AppDataDirectory, "contacts.db3"), SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.SharedCache); await _database.CreateTableAsync(); } public async Task> GetContactsAsync() { return await _database.Table().ToListAsync(); } public async Task> SearchContactsAsync(string searchTerm) { if (string.IsNullOrWhiteSpace(searchTerm)) return await GetContactsAsync(); // Всегда получаем все контакты и фильтруем в памяти // Это обеспечит одинаковое поведение для всех языков var allContacts = await GetContactsAsync(); var compareInfo = CultureInfo.CurrentCulture.CompareInfo; return allContacts? .Where(c => compareInfo.IndexOf(c.Name ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 || compareInfo.IndexOf(c.PhoneNumber ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 || compareInfo.IndexOf(c.Email ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 || compareInfo.IndexOf(c.Address ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0 || compareInfo.IndexOf(c.Description ?? "", searchTerm, CompareOptions.IgnoreCase) >= 0) .DistinctBy(c => c.Id) .ToList() ?? new List(); } private bool ContainsCyrillic(string text) { return text.Any(c => c >= 'а' && c <= 'я' || c >= 'А' && c <= 'Я'); } public async Task GetContactAsync(int id) { return await _database.Table().Where(c => c.Id == id).FirstOrDefaultAsync(); } public async Task SearchIdByNameOrDefault(Contact contact) { var dataList = await _database.Table().Where(c => c.Name == contact.Name).ToListAsync(); if(dataList.Count == 0) return contact; return dataList[0]; } public async Task SaveContactAsync(Contact contact) { if (contact.Id != 0) { return await _database.UpdateAsync(contact); } else { return await _database.InsertAsync(contact); } } public async Task SaveContactsAsync(List contacts) { var insertList = new List(); var updateList = new List(); foreach (var contact in contacts) { if(contact.Id != 0) updateList.Add(contact); else insertList.Add(contact); } await _database.UpdateAllAsync(updateList); await _database.InsertAllAsync(insertList); } public async Task DeleteContactAsync(Contact contact) { return await _database.DeleteAsync(contact); } public async Task ClearAll() { await _database.DeleteAllAsync(); } } }