using adas_core.Domain.Enums;
using MongoDB.Bson;

namespace adas_core.Domain.Models.MongoModels;

/// <summary>
/// Represents a point-of-care location or entity within a healthcare delivery context.
/// </summary>
/// <remarks>
/// This class serves as a data model for capturing information related to a specific point where care is administered to patients.
/// </remarks>
public class PointOfCare
{
    public ObjectId Id { get; set; }
    public string Room { get; set; } = string.Empty;
    public string Bed { get; set; } = string.Empty;
    public string? Hall { get; set; } = string.Empty;
    public ObjectId UnitId { get; set; }
    public PointOfCareConfiguration? Configuration { get; set; }
    public StatusEnum.PointOfCare Status { get; set; }
    public ObjectId? AdmissionId { get; set; }

    #region Unmap

    public string UnitName { get; set; } = string.Empty;
    public Unit? Unit { get; set; }
    public PatientLocation Location => new(UnitName, Bed, Room);
    public List<PatientObservation> Observations { get; set; } = [];
    public bool? HasPatient { get; set; }
    public ObjectId? Patientid { get; set; }
    public Patient? Patient { get; set; }
    public bool? IsActive { get; set; }
    public bool? IsVisible { get; set; }
    public Admission? Admission { get; set; }

    #endregion
}

/// <summary>
/// Represents the configuration settings for a point-of-care system, encapsulating the parameters and options required to manage its behavior.
/// </summary>
public class PointOfCareConfiguration
{
    public List<ObjectId>? BeaconIdList { get; set; } = [];
    public List<ObjectId>? CameraIdList { get; set; } = [];
    public List<ObjectId>? RelayIdList { get; set; }
    public List<LightBeacon>? BeaconList { get; private set; }
    public List<Camera>? CameraList { get; private set; }
    public List<Relay>? RelayList { get; private set; }
    public string? Type { get; set; }

    // Esta parte hay que tenerla en cuenta al momento de lanzar las grabaciones automaticas y manuales para la API de OR
    // OR espera recibir roomId
    public int? Id { get; set; }
}