using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using FarmmapsApi.Models; using FarmmapsApi.Services; using FarmmapsHaulmkilling.Models; using Microsoft.Extensions.Logging; using Newtonsoft.Json; using static FarmmapsApi.Extensions; using static FarmmapsApiSamples.Constants; namespace FarmmapsHaulmkilling { public class HaulmkillingService { private readonly ILogger<HaulmkillingService> _logger; private readonly FarmmapsApiService _farmmapsApiService; private readonly GeneralService _generalService; public HaulmkillingService(ILogger<HaulmkillingService> logger, FarmmapsApiService farmmapsApiService, GeneralService generalService) { _logger = logger; _farmmapsApiService = farmmapsApiService; _generalService = generalService; } /// <summary> /// Gets the list of available haulmkilling agents /// </summary> /// <returns>List of haulmkilling agents</returns> public async Task<List<HaulmkillingAgent>> GetHaulmkillingAgents() { var itemType = "vnd.farmmaps.itemtype.codelist.fm005"; var haulmkillingAgentItems = await _farmmapsApiService.GetItemsAsync(string.Empty, itemType); return haulmkillingAgentItems.Select(item => item.Data.ToObject<HaulmkillingAgent>()) .ToList(); } /// <summary> /// Creates an haulmkilling application map /// </summary> /// <param name="cropfieldItem">The context cropfield item to use</param> /// <param name="inputItem">The geotiff item to use</param> /// <param name="inputType">WDVI or NDVI</param> /// <param name="agentCode">code of one of the available agents</param> /// <param name="selectedOption">One of the available options</param> /// <returns>Haulmkilling application map item</returns> public async Task<Item> CalculateApplicationMapAsync(Item cropfieldItem, Item inputItem, string inputType, string selectedOption, HaulmkillingAgent agent) { var taskRequest = new TaskRequest() { TaskType = "vnd.farmmaps.task.vrahaulmkilling" }; taskRequest.attributes["inputCode"] = inputItem.Code; taskRequest.attributes["inputType"] = inputType; taskRequest.attributes["agentCode"] = agent.Code; taskRequest.attributes["selectedOption"] = selectedOption; taskRequest.attributes["minPercentile"] = "0.0"; var taskCode = await _farmmapsApiService.QueueTaskAsync(cropfieldItem.Code, taskRequest); await PollTask(TimeSpan.FromSeconds(3), async (tokenSource) => { _logger.LogInformation("Checking vrahaulmkilling task status"); var itemTaskStatus = await _farmmapsApiService.GetTaskStatusAsync(cropfieldItem.Code, taskCode); 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 = $"VRAHaulmkilling {agent.Label}"; var applianceMapItem = await _generalService.FindChildItemAsync(cropfieldItem.Code, GEOTIFF_PROCESSED_ITEMTYPE, itemName, i => i.Updated >= itemTask.Finished && i.Name.ToLower().Contains(itemName.ToLower())); if (applianceMapItem == null) { _logger.LogError("Could not find the VRAHaulmkilling geotiff child item under cropfield"); return null; } return applianceMapItem; } } }