using FarmmapsApi.Models; using FarmmapsApi.Services; using FarmMapsBlight.Models; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Threading.Tasks; using static FarmmapsApi.Extensions; using static FarmmapsApiSamples.Constants; namespace FarmMapsBlight { public class BlightService { private readonly ILogger _logger; private readonly FarmmapsApiService _farmmapsApiService; private readonly GeneralService _generalService; public BlightService(ILogger logger, FarmmapsApiService farmmapsApiService, GeneralService generalService) { _logger = logger; _farmmapsApiService = farmmapsApiService; _generalService = generalService; } public async Task CreateAdvice(Item cropfieldItem, DateTime adviceDate, DateTime plantingDate, DateTime emergeDate) { var taskRequest = new TaskRequest() { TaskType = "vnd.farmmaps.task.blight" }; taskRequest.attributes["d"] = adviceDate.ToUniversalTime().ToString("o"); taskRequest.attributes["plantingDate"] = plantingDate.ToUniversalTime().ToString("o"); taskRequest.attributes["emergeDate"] = emergeDate.ToUniversalTime().ToString("o"); List sprays = new List(); sprays.Add(new Spray() { fungicideCode = "FLEX", SprayTime = new DateTime(2020, 7, 1), dose = 0.6, isVRA = false }); taskRequest.attributes["sprays"] = JsonConvert.SerializeObject(sprays); List irrigations = new List(); irrigations.Add(new Irrigation() { startTime = new DateTime(2020, 7, 1, 2, 0, 0), endTime = new DateTime(2020, 7, 1, 14, 0, 0) }); taskRequest.attributes["irrigations"] = JsonConvert.SerializeObject(irrigations); var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, taskRequest); await PollTask(TimeSpan.FromSeconds(3), async (tokenSource) => { var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); _logger.LogInformation($"Checking blight task status: { itemTaskStatus.State}"); if (itemTaskStatus.IsFinished) tokenSource.Cancel(); }); var itemTask = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); if (itemTask.State == ItemTaskState.Error) { _logger.LogError($"Something went wrong with task execution: {itemTask.Message}"); return null; } var itemName = $"Blight"; var blightAdviceItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, BLIGHT_ITEMTYPE, itemName); // incorrect filter task is finished after updating // i => i.Updated >= itemTask.Finished && i.Name.ToLower().Contains(itemName.ToLower()) if (blightAdviceItem == null) { _logger.LogError("Could not find the blight item under cropfield"); return null; } return blightAdviceItem; } } }