using adas_core.Domain.Models;
using adas_core.Domain.Models.GroupedObservations;
using adas_core.Domain.Models.MongoModels;

namespace adas_core.Application.Services.Interfaces;

public interface IObservationDemoService
{
    /// <summary>
    /// Generates a list of patient observations by evaluating the specified data fields for the given patient.
    /// </summary>
    /// <param name="patient">The patient for whom the observations are being generated.</param>
    /// <param name="dataFields">The collection of fields used to drive the observation generation.</param>
    /// <returns>A task representing the asynchronous operation that returns the list of generated patient observations.</returns>
    Task<List<PatientObservation>> GenerateObservationByField(Patient patient, List<Field> dataFields);
    /// <summary>
    /// Generates a grouped observation for the specified patient based on the provided grouped field configuration.
    /// </summary>
    /// <param name="patient">The patient for whom the grouped observation is generated.</param>
    /// <param name="groupedField">The grouped field definition that determines the grouping criteria for the observation.</param>
    /// <returns>A task that represents the asynchronous operation. The task result contains the generated <see cref="GroupedObservation"/>.</returns>
    Task<GroupedObservation> GenerateGroupedObservation(Patient patient, GroupedField groupedField);
    /// <summary>
    /// Generates a list of patient observation alarms for the specified patient based on the provided data alarm fields.
    /// </summary>
    /// <param name="patient">The patient for whom the observation alarms are generated.</param>
    /// <param name="dataAlarmfields">The list of fields used to determine and generate the data alarms.</param>
    /// <returns>A task that represents the asynchronous operation, containing a list of <see cref="PatientObservationAlarm"/> objects generated for the patient.</returns>
    Task<List<PatientObservationAlarm>> GenerateAlarmByField(Patient patient, List<Field> dataAlarmfields);
}