using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using backend.Data; using backend.DTOs; using backend.Models; namespace backend.Controllers; [ApiController] [Route("api/[controller]")] public class KhatmController : ControllerBase { private readonly AppDbContext _db; public KhatmController(AppDbContext db) { _db = db; } [HttpGet("items")] public async Task GetItems() { var items = await _db.KhatmItems .OrderBy(k => k.Id) .Select(k => new KhatmItemDto { Id = k.Id, Title = k.Title, Url = k.Url, Points = k.Points }) .ToListAsync(); return Ok(items); } [HttpPost("save")] public async Task SaveSelections([FromBody] KhatmSaveRequest request) { var user = await _db.Users.FindAsync(request.UserId); if (user == null) { return NotFound(new { message = "کاربر یافت نشد." }); } foreach (var selection in request.Selections) { var existing = await _db.UserKhatmSelections .FirstOrDefaultAsync(ks => ks.UserId == request.UserId && ks.KhatmItemId == selection.KhatmItemId); if (existing != null) { existing.IsSelected = selection.IsSelected; existing.LastModified = DateTime.UtcNow; } else { _db.UserKhatmSelections.Add(new UserKhatmSelection { UserId = request.UserId, KhatmItemId = selection.KhatmItemId, IsSelected = selection.IsSelected, LastModified = DateTime.UtcNow }); } } // Recalculate total score await RecalculateTotalScore(request.UserId); await _db.SaveChangesAsync(); var totalScore = await _db.UserTotalScores .Where(ts => ts.UserId == request.UserId) .Select(ts => ts.TotalPoints) .FirstOrDefaultAsync(); return Ok(new KhatmSaveResponse { Success = true, TotalScore = totalScore }); } private async Task RecalculateTotalScore(int userId) { var quizPoints = await _db.UserQuizAttempts .Where(qa => qa.UserId == userId) .Select(qa => (int?)qa.TotalQuizPoints) .FirstOrDefaultAsync() ?? 0; var khatmPoints = await _db.UserKhatmSelections .Where(ks => ks.UserId == userId && ks.IsSelected) .SumAsync(ks => ks.KhatmItem.Points); int total = quizPoints + khatmPoints; var totalScore = await _db.UserTotalScores .FirstOrDefaultAsync(ts => ts.UserId == userId); if (totalScore != null) { totalScore.TotalPoints = total; } } }