using Health.Domain.Entities; using Health.Domain.Enums; namespace Health.Application.Diets; public sealed class DietService(IDietRepository diets) : IDietService { private readonly IDietRepository _diets = diets; public async Task> ListAsync(Guid userId, string? date, string? mealType, CancellationToken ct) { var recordedAt = DateOnly.TryParse(date, out var d) ? d : (DateOnly?)null; var parsedMealType = Enum.TryParse(mealType, ignoreCase: true, out var mt) ? mt : (MealType?)null; var records = await _diets.ListAsync(userId, recordedAt, parsedMealType, ct); return records.Select(ToDto).ToList(); } public async Task CreateAsync(Guid userId, DietRecordCreateRequest request, CancellationToken ct) { var record = new DietRecord { Id = Guid.NewGuid(), UserId = userId, MealType = request.MealType, TotalCalories = request.TotalCalories, HealthScore = request.HealthScore, RecordedAt = request.RecordedAt, CreatedAt = DateTime.UtcNow, }; foreach (var item in request.FoodItems) { record.FoodItems.Add(new DietFoodItem { Id = Guid.NewGuid(), Name = item.Name, Portion = item.Portion, Calories = item.Calories, SortOrder = item.SortOrder, }); } await _diets.AddAsync(record, ct); await _diets.SaveChangesAsync(ct); return record.Id; } public async Task DeleteAsync(Guid userId, Guid recordId, CancellationToken ct) { var record = await _diets.GetOwnedAsync(userId, recordId, ct); if (record == null) return false; _diets.Delete(record); await _diets.SaveChangesAsync(ct); return true; } public async Task UpdateAsync(Guid userId, Guid recordId, DietRecordPatchRequest request, CancellationToken ct) { var record = await _diets.GetOwnedAsync(userId, recordId, ct); if (record == null) return false; if (request.TotalCalories.HasValue) record.TotalCalories = request.TotalCalories.Value; if (request.HealthScore.HasValue) record.HealthScore = request.HealthScore.Value; await _diets.SaveChangesAsync(ct); return true; } private static DietRecordDto ToDto(DietRecord record) => new( record.Id, record.MealType.ToString(), record.TotalCalories, record.HealthScore, record.RecordedAt, record.FoodItems.OrderBy(f => f.SortOrder).Select(f => new DietFoodItemDto(f.Name, f.Portion, f.Calories)).ToList()); }