using PARR.Core.Repositories.Base;
using PARR.Domain.Entities;
using PARR.Domain.Enums;

namespace PARR.Core.Repositories.Interfaces
{
    public interface IRobotConfigurationRepository : IBaseRepository<RobotConfiguration>
    {
        /// <summary>
        /// Обновить статус работы робота
        /// </summary>
        /// <param name="robotStatus"></param>
        /// <param name="configuration"></param>
        void ChangeRobotStatus(RobotStatusEnum robotStatus, RobotConfiguration configuration);

        /// <summary>
        /// Обновить статус задания (автоматически обновляется статус робота при необходимости)
        /// </summary>
        /// <param name="taskStatus"></param>
        /// <param name="configuration"></param>
        void ChangeTaskStatus(TaskStatusEnum taskStatus, RobotConfiguration configuration);

        /// <summary>
        /// Поиск невыполненных заданий и установка им статуса ошибки робота
        /// </summary>
        /// <param name="robotAttemptsNumber"></param>
        /// <param name="robotWaitTime"></param>
        /// <returns></returns>
        Task MarkExpiredTasksAsFailedAsync(int robotAttemptsNumber, TimeSpan robotWaitTime);

        /// <summary>
        /// Получить конфигурацию из шаблона по RobotCode. У шаблона обязательно должен быть Include таблицы RobotConfiguration
        /// </summary>
        /// <param name="robotsEnum"></param>
        /// <param name="template"></param>
        /// <returns></returns>
        RobotConfiguration GetFromTemplateByRobotCode(RobotsEnum robotsEnum, Template template);

        /// <summary>
        /// Установить статус задания "Обновить", если разрешено
        /// </summary>
        /// <param name="configuration"></param>
        /// <returns>true - если изменил статус, false - нельзя изменить статус</returns>
        bool SetUpdateTaskStatusIfAllow(RobotConfiguration configuration);

        /// <summary>
        /// Атомарно установить статус задачи "В работе" если текущий статус "В ожидании".
        /// </summary>
        /// <param name="id"></param>
        /// <returns></returns>
        Task<bool> SetInProgressStatusAsync(Guid id);
    }
}
