using System; using System.Collections; using System.Collections.Generic; using System.Linq; using System.Security.Cryptography; using System.Text; using System.Threading.Tasks; using Entity; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata.Internal; using Shared; namespace Contextlib { public class DbQuoteManager : IQuoteService { private WTFContext _context; private GenericRepository _repo; private DbCharacterManager _dbC; private DbSourceManager _dbS; private DbImagesManager _dbI; public DbQuoteManager(WTFContext context) { _context = context ?? throw new ArgumentNullException(nameof(context), "Database context cannot be null."); _repo = new GenericRepository(_context); _dbS = new DbSourceManager(_context); _dbC = new DbCharacterManager(_context); _dbI = new DbImagesManager(_context); } public async Task AddQuote(Quote quote) { if (quote == null) { throw new ArgumentNullException(nameof(quote), "quote cannot be null."); } //Character var c = await _dbC.GetCharByName(quote.Character.Name); if (c != null) { quote.IdCharacter = c.Id; quote.Character = c; } //Image var i = await _dbI.GetImageByPath(quote.Character.Images.ImgPath); if (i != null) { quote.Character.IdImage = i.Id; quote.Character.Images = i; } //Source var s = await _dbS.GetSourceByTitle(quote.Source.Title); if (s != null) { quote.IdSource = s.Id; quote.Source = s; } _repo.Insert(quote); await _context.SaveChangesAsync(); return quote; } public async Task> GetAllQuote() { List quotes = _context.quotes.Where(item => item.IsValid) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .ToList(); return new PaginationResult(quotes.Count, 0, quotes.Count, quotes); } public async Task> GetAllQuoteLang(int index, int pageSize, int lang) { List quotes = await _context.quotes.Where(item => item.IsValid && item.Langage == (LangEnum)lang) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToListAsync(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task GetDailyQuote(DateOnly date, int lang) { List quotes = await _context.quotes.Where(item => item.IsValid && item.Langage == (LangEnum)lang) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images).Include(q => q.Favorite) .ToListAsync(); if (quotes.Count() == 0) return null; Quote quote = quotes[date.DayNumber % quotes.Count()]; return quote; } public async Task> GetFavorites(int index, int pageSize, int UserId) { List quotes = _context.quotes.Where(item => item.IsValid && item.Favorite.Where(p => p.Id == UserId) != null) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images).Include(q => q.Favorite) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> GetInvalidQuote(int index, int pageSize, int lang) { List quotes = _context.quotes.Where(item => !item.IsValid && item.Langage == (LangEnum)lang) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> GetInvalidQuote(int index, int pageSize) { List quotes = _context.quotes.Where(item => !item.IsValid) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task GetLastQuoteId() { PaginationResult quotes = await GetAllQuote(); int lastQuoteId = 0; foreach (Quote quote in quotes.items) { if (quote.Id >= lastQuoteId) { lastQuoteId = quote.Id + 1; } } return lastQuoteId; } public async Task GetQuoteById(int id) { Quote? quote = _context.quotes.Where(item => item.Id == id) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .FirstOrDefault(); return quote; } public async Task> GetSomeQuote(int index, int pageSize) { List quotes = _context.quotes.Where(item => item.IsValid) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> GetSuggestions(int index, int pageSize, int lang) // A changer Suggestion Random { List quotes = _context.quotes.Where(item => item.IsValid && item.Langage == (LangEnum)lang) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) //.OrderBy(q=> new Random() ) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> GetValidQuote(int index, int pageSize) { List quotes = _context.quotes.Where(item => item.IsValid) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> SearchByCharacter(string character, int index, int pageSize, int lang) { List quotes = _context.quotes.Where(item => item.IsValid && item.Langage==(LangEnum)lang && (item.Character.Name).Contains(character)) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> SearchByContent(string content, int index, int pageSize, int lang) { List quotes = _context.quotes.Where(item => item.IsValid && item.Langage == (LangEnum)lang && (item.Content).Contains(content)) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task> SearchBySource(string source, int index, int pageSize, int lang) { List quotes = _context.quotes.Where(item => item.IsValid && item.Langage == (LangEnum)lang && (item.Source.Title).Contains(source)) .Include(q => q.Source).Include(q => q.Character).ThenInclude(c => c.Images) .Skip(index * pageSize).Take(pageSize).ToList(); return new PaginationResult(quotes.Count, index, pageSize, quotes); } public async Task RemoveQuote(int quoteId) { var quote = _repo.GetById(quoteId); if (quote == null) throw new KeyNotFoundException(); _repo.Delete( quote ); await _context.SaveChangesAsync(); } public async Task UpdateQuote(int quoteId, Quote quote) { //Character var c = await _dbC.GetCharByName(quote.Character.Name); if (c != null) { quote.IdCharacter = c.Id; quote.Character = c; } //Image var i = await _dbI.GetImageByPath(quote.Character.Images.ImgPath); if (c != null) { quote.Character.IdImage = i.Id; quote.Character.Images = i; } //Source var s = await _dbS.GetSourceByTitle(quote.Source.Title); if (c != null) { quote.IdSource = s.Id; quote.Source = s; } Quote? q = _repo.GetById(quoteId); if (q != null) { bool change = false; if (quote.IdSource != 0) { q.IdSource = quote.IdSource; change = true; } if (quote.IdCharacter != 0) { q.IdCharacter = quote.IdCharacter; change = true; } if (quote.IdSource != 0) { q.IdSource = quote.IdSource; change = true; } if (quote.IdUsersPropose !=0) { q.IdUsersPropose = quote.IdUsersPropose; change = true; } if (quote.Content != null || quote.Content == "") { q.Content = quote.Content; change = true; } if (quote.IsValid != q.IsValid) { q.IsValid = quote.IsValid; change = true; } if (quote.Likes != q.Likes) { q.Likes = quote.Likes; change = true; } if (quote.Langage != q.Langage) { q.Langage = quote.Langage; change = true; } _repo.Update(q); if (change) _context.SaveChanges(); } return ; } public async Task ValidateQuote(int quoteId, bool isValidate) { Quote? q = _repo.GetById(quoteId); if (q != null) { q.IsValid = isValidate; _repo.Update(q); _context.SaveChanges(); } return; } } }