using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using PARR.API.Contracts.V1;
using PARR.API.Contracts.V1.Requests.Queries;
using PARR.API.Controllers.V1.Base;
using PARR.API.Services.Interfaces;
using PARR.Core.Repositories.Interfaces;
using PARR.Core.Repositories.Interfaces.Unit;
using PARR.Domain.Common.Roles;

namespace PARR.API.Controllers.V1
{
    /// <summary>
    /// Выдает задания Агенту сервера
    /// </summary>
    [Authorize(Roles = ParrRoles.Agent.RoleOrAdmin)]
    public class AgentTaskController : BaseApiController
    {
        private readonly IClientService clientService;
        private readonly ITemplateRepository templateService;
        private readonly IUnitRepository unitService;
        //private readonly IEsppScheduleTransformService esppScheduleTransformService;
        private readonly ILogger<AgentTaskController> logger;

        public AgentTaskController(
            IClientService clientService,
            ITemplateRepository templateService,
            IUnitRepository unitService,
            //IEsppScheduleTransformService esppScheduleTransformService,
            ILogger<AgentTaskController> logger
            )
        {
            this.clientService = clientService;
            this.templateService = templateService;
            this.unitService = unitService;
            //this.esppScheduleTransformService = esppScheduleTransformService;
            this.logger = logger;
        }


        /// <summary>
        /// Список заданий агенту по ip-адресу клиента исполнителя
        /// </summary>
        /// <param name="request"></param>
        /// <returns></returns>
        [HttpGet(ApiRoutes.AgentTask.GetByIp)]
        public async Task<IActionResult> GetByClientIp([FromQuery] AgentTaskGetByIpQuery request)
        {

            return Ok("Метод не реализован");
            ////ПАРР-ДВС-ПТК__ВРТ-DVGD-SDMI-WEB-01-ДВС__ПРОЧЕЕ(РАБОТЫ)
            ////10.99.253.65
            ////2023-10-16

            //var ip = request.Ip ?? clientService.GetClientIp()?.ToString();

            //if (string.IsNullOrEmpty(ip))
            //    return BadRequest(new Response(false, new List<ErrorModel> { new ErrorModel { Message = "Client IP address is null." } }));

            ////var date = request.Date ?? DateTimeOffset.UtcNow;
            //var date = DateTimeOffset.UtcNow;

            ////Агент получает задания, если `IsAgent = true`, шаблон и расписания активны, и статус синхронизации шаблона и расписания `= Ok`, и `NextRun = сегодня`, так же если у ApplicationInWork есть расписание.

            //// С одним IP может быть несколько информационных систем, так что может быть несколько хостов
            //var units = await unitService.GetWithIncludes().AsNoTracking().Where(t => t.UnitValues.Any(v => v.Field!.AihitName == "IP_АДРЕС" && v.Value!.Value == ip)).ToListAsync();
            //var templates = await templateService.Get()
            //                        .Include(t => t.RobotConfigurations)
            //                        .Include(t => t.Job)
            //                            .ThenInclude(t=>t!.Group)
            //                                .ThenInclude(t => t!.EsppSchValues)
            //                        .Include(t => t.Unit)
            //                        .Where(t => units.Any(u=>u.Id == t.UnitId)
            //                                        //&& t.ApplicationsInWork!.IsAgent == true//TODO Migration to job
            //                                        && t.IsActiveTemplate == true
            //                                        && t.IsActiveSchedule == true
            //                                        //&& t.ApplicationsInWork!.NextRun.DateTime.Date == date.Date.Date
            //                                        && t.NextRun.DateTime.Date == date.Date.Date
            //                                        && t.RobotConfigurations.All(c => c.TaskStatusCode == (int)TaskStatusEnum.Ok)
            //                                        && t.Job!.Group!.EsppSchValues.Any()//.ApplicationsInWork.EsppSchValues.Any()
            //                        ).ToListAsync();

            //if (!templates.Any())
            //    return NoContent();

            //var response = new AgentTaskMinResponse
            //{
            //    Scheduled = new List<AgentTaskMinScheduleResponse>()
            //};

            //foreach (var template in templates)
            //{
            //    //var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.ApplicationInWorkId, template.ApplicationsInWork!.LastRun ?? template.ApplicationsInWork!.NextRun);
            //    var templateSchedule = await esppScheduleTransformService.GetNextScheduleAsync(template.Job!.GroupId, template.NextRun);

            //    if (!templateSchedule.Any())
            //    {
            //        logger.LogWarning($"Запросили раписание для агента по NextRun и вернулся пустой список! Такого не должно быть! " +
            //            $"JobGroupId: {template.Job.GroupId}, latRun: {template.LastRun}, NextRun: {template.NextRun}, ip: {ip}, date: {date}");
            //        continue;
            //    }

            //    if (string.IsNullOrEmpty(template.Job.Group!.AgentName) && string.IsNullOrEmpty(template.Job.Group!.AgentScript))
            //    {
            //        logger.LogWarning($"Запросили задание для агента с пустыми значениями AgentName && AgentScript. Такого не должно быть! " +
            //          $"JobGroupId: {template.Job.GroupId}, AgentName: {template.Job.Group.AgentName}, AgentScript: {template.Job.Group.AgentScript} , ip: {ip}, date: {date}");
            //        continue;
            //    }

            //    templateSchedule.ForEach(item => response.Scheduled.Add(new AgentTaskMinScheduleResponse
            //    {
            //        Name = template.Job.Group.AgentName ?? "",
            //        Script = template.Job.Group.AgentScript ?? "",
            //        StartAt = item,
            //        TemplateId = template.Id
            //    }));
            //}

            //if (!response.Scheduled.Any())
            //    return NoContent();

            //response.Scheduled = response.Scheduled.OrderBy(t => t.StartAt).ToList();

            //logger.LogInformation($"Агент с IP-адресом {ip} получил задания: [{string.Join(';', response.Scheduled.Select(s => $"StartAt:{s.StartAt}, Name:{s.Name}, TemplateId:{s.TemplateId}"))}]");

            //return Ok(response);
        }

    }
}
