using adas_core.Domain.Enums;
using adas_core.Domain.Models.DTO;
using adas_core.Domain.Models.DTO.Display;
using adas_core.Domain.Models.Filter;
using adas_core.Domain.Models.Masters;
using adas_core.Domain.Models.MongoModels;
using adas_core.Domain.Models.Responses;
using MongoDB.Bson;

namespace adas_core.Application.Services.Interfaces;

public interface IDisplayService
{
    //Task<List<DisplayWithPermissionsDto>> GetAll(string? userName, List<Authorization> displayIdByAuthorities);
    Task<List<DisplayMinimalDto>> GetAllCompact();
    Task<List<DisplayWithPermissionsDto>> GetAllByUser(string? userName);
    Task<List<Display>> GetByType(DisplayConfigEnums.DisplayType type);
    Task<List<Display>> GetByPointOfCare(PointOfCare pointOfCare);
    Task<List<Display>> GetByConfigId(ObjectId configId);
    Task<List<Display>> GetByCardConfigId(ObjectId configId);

    // Task<List<Display>> GetByUser();
    Task<Display?> GetByName(string name);
    Task<Display?> GetById(ObjectId id);
    Task<DisplayWithPermissionsDto> GetByIdWithPermissions(ObjectId id, LocaleEnum localeEnum);
    Task<long> CountDisplaysByUnitId(ObjectId unitId);

    Task<Display?> GetInfo(
        ObjectId id,
        string? userName,
        List<Authorization>? authorizations,
        LocaleEnum? locale,
        bool fillPointOfCare = true,
        bool fillPatientData = false,
        bool fillDisplayList = true,
        bool fillDisplayConfig = true,
        CancellationToken ct = default
    );
    

    Task<List<MinimalDisplaySection>> GetDisplaySectionByUser(
        DisplayConfigEnums.DisplayType type,
        ObjectId? currentDisplay,
        string? userName,
        List<Authorization>? authorizations);

    Task<MinimalDisplayListDto> GetAllDisplaySection();
    Task<List<Display>> GetByUnitId(ObjectId id);
    Task<PocAndUnitDto> GetAllAvailablePoc(List<string> displayIds, bool excludeVirtual = false);
    Task<List<PointOfCare>> GetAllPocsByDisplayId(ObjectId id);
    Task<Display> InsertOne(Display display);
    Task<Display> InsertOneTest();
    Task<Display?> UpdateConfig(Display oldDisplay, DisplayConfig? newDisplayConfig);
    Task<Display?> UpdateConfigId(Display oldDisplay, ObjectId configId);
    Task<Display?> UpdatePointOfCareList(ObjectId objectId, List<ObjectId> listPocObId);
    Task<Display?> UpdateConfigPreset(ObjectId objectIdDisplay, ObjectId objectIdConfigDisplay);
    Task<Display?> UpdateName(ObjectId id, string name);
    Task<PaginationResponse<Display>> GetPaginatedDisplays(PaginationFilter filter);
    Task<bool> DeleteDisplay(ObjectId id);
    Task<List<DisplayConfigLocationDto>> GetDisplayConfigLocations(ObjectId displayConfigId);
    Task<bool> IsDisplayConfigInUse(ObjectId displayConfigId);
    Task DeleteDisplaysByUnitId(ObjectId unitId);
}