using Health.Domain.Entities;
using Health.Domain.Enums;

namespace Health.Application.Diets;

public sealed record DietFoodItemInput(
    string Name,
    string? Portion,
    int? Calories,
    int SortOrder);

public sealed record DietRecordCreateRequest(
    MealType MealType,
    int? TotalCalories,
    int? HealthScore,
    DateOnly RecordedAt,
    IReadOnlyList<DietFoodItemInput> FoodItems);

public sealed record DietRecordPatchRequest(
    int? TotalCalories,
    int? HealthScore);

public sealed record DietFoodItemDto(
    string Name,
    string? Portion,
    int? Calories);

public sealed record DietRecordDto(
    Guid Id,
    string MealType,
    int? TotalCalories,
    int? HealthScore,
    DateOnly RecordedAt,
    IReadOnlyList<DietFoodItemDto> FoodItems);

public interface IDietService
{
    Task<IReadOnlyList<DietRecordDto>> ListAsync(Guid userId, string? date, string? mealType, CancellationToken ct);
    Task<Guid> CreateAsync(Guid userId, DietRecordCreateRequest request, CancellationToken ct);
    Task<bool> DeleteAsync(Guid userId, Guid recordId, CancellationToken ct);
    Task<bool> UpdateAsync(Guid userId, Guid recordId, DietRecordPatchRequest request, CancellationToken ct);
}

public interface IDietRepository
{
    Task<IReadOnlyList<DietRecord>> ListAsync(Guid userId, DateOnly? recordedAt, MealType? mealType, CancellationToken ct);
    Task<DietRecord?> GetOwnedAsync(Guid userId, Guid recordId, CancellationToken ct);
    Task AddAsync(DietRecord record, CancellationToken ct);
    void Delete(DietRecord record);
    Task SaveChangesAsync(CancellationToken ct);
}
