diff --git a/FarmmapsHaulmkilling/HaulmkillingApplication.cs b/FarmmapsHaulmkilling/HaulmkillingApplication.cs index 1496182..bfb87ed 100644 --- a/FarmmapsHaulmkilling/HaulmkillingApplication.cs +++ b/FarmmapsHaulmkilling/HaulmkillingApplication.cs @@ -1,13 +1,69 @@ +using System.IO; +using System.Linq; using System.Threading.Tasks; using FarmmapsApi; +using FarmmapsApi.Services; +using Microsoft.Extensions.Logging; namespace FarmmapsHaulmkilling { public class HaulmkillingApplication : IApplication { - public Task RunAsync() + private const string DownloadFolder = "Downloads"; + + private readonly ILogger _logger; + private readonly FarmmapsApiService _farmmapsApiService; + private readonly HaulmkillingService _haulmkillingService; + private readonly GeneralService _generalService; + + public HaulmkillingApplication(ILogger logger, FarmmapsApiService farmmapsApiService, + GeneralService generalService, HaulmkillingService haulmkillingService) { - throw new System.NotImplementedException(); + _logger = logger; + _farmmapsApiService = farmmapsApiService; + _generalService = generalService; + _haulmkillingService = haulmkillingService; + } + + public async Task RunAsync() + { + if (!Directory.Exists(DownloadFolder)) + Directory.CreateDirectory(DownloadFolder); + + // !! this call is needed the first time an api is called with a fresh clientid and secret !! + await _farmmapsApiService.GetCurrentUserCodeAsync(); + var roots = await _farmmapsApiService.GetCurrentUserRootsAsync(); + + var myDrive = roots.SingleOrDefault(r => r.Name == "My drive"); + if (myDrive == null) + { + _logger.LogError("Could not find a needed root item"); + return; + } + + var uploadedRoot = roots.SingleOrDefault(r => r.Name == "Uploaded"); + if (uploadedRoot == null) + { + _logger.LogError("Could not find a needed root item"); + return; + } + + var agents = await _haulmkillingService.GetHaulmkillingAgents(); + if (agents == null) + { + _logger.LogError("No valid agents found for haulmkilling"); + return; + } + + // save cropfield item and check if already exists and created (this to not have to run satellite everytime) + _logger.LogInformation("Creating cropfield"); + var cropfieldItem = await _generalService.CreateCropfieldItemAsync(myDrive.Code, "Cropfield VRA Haulmkilling", 2020, + @"{""type"":""Polygon"",""coordinates"":[[[4.617786844284247,52.22533706956424],[4.618642601314543,52.225938364585989],[4.6192153806397,52.22563988897754],[4.619192414656403,52.2256242822442],[4.620306732153958,52.225031745661528],[4.620542019225217,52.22519855319158],[4.621157509147853,52.22487436515405],[4.623387917230182,52.22367660757213],[4.624563444939009,52.22304740241544],[4.624562779355982,52.223046635247019],[4.624534908813479,52.22302596787506],[4.627873021330343,52.221240670658399],[4.627504935938338,52.220104419135129],[4.627324878706837,52.22020569669098],[4.627320696113512,52.22020660117888],[4.626707169518044,52.22053923770041],[4.624700376420229,52.221619047547488],[4.623471571183885,52.22227447969577],[4.623471511010673,52.22227500174403],[4.623468838689317,52.22228052566992],[4.617786844284247,52.22533706956424]]]}"); + + // run satellite task on just added cropfield + + + // find ndvi or wdvi satellite data geotiffs } } } \ No newline at end of file diff --git a/FarmmapsHaulmkilling/HaulmkillingService.cs b/FarmmapsHaulmkilling/HaulmkillingService.cs index 65bea78..19ba565 100644 --- a/FarmmapsHaulmkilling/HaulmkillingService.cs +++ b/FarmmapsHaulmkilling/HaulmkillingService.cs @@ -1,7 +1,36 @@ +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using FarmmapsApi.Services; +using FarmmapsHaulmkilling.Models; +using Microsoft.Extensions.Logging; + namespace FarmmapsHaulmkilling { public class HaulmkillingService { + private readonly ILogger _logger; + private readonly FarmmapsApiService _farmmapsApiService; + private readonly GeneralService _generalService; + + public HaulmkillingService(ILogger logger, FarmmapsApiService farmmapsApiService, + GeneralService generalService) + { + _logger = logger; + _farmmapsApiService = farmmapsApiService; + _generalService = generalService; + } + public async Task> GetHaulmkillingAgents() + { + var itemType = "vnd.farmmaps.package.vra.haulmkilling"; + var vraHerbicideDataItems = await _farmmapsApiService.GetItemsAsync(string.Empty, itemType); + + var item = vraHerbicideDataItems.FirstOrDefault(); + if (item == null) + return null; + + return item.Data.ContainsKey("agents") ? item.Data["agents"].ToObject>() : null; + } } } \ No newline at end of file diff --git a/FarmmapsHaulmkilling/Models/HaulmkillingAgent.cs b/FarmmapsHaulmkilling/Models/HaulmkillingAgent.cs new file mode 100644 index 0000000..929197a --- /dev/null +++ b/FarmmapsHaulmkilling/Models/HaulmkillingAgent.cs @@ -0,0 +1,30 @@ +using System.Collections.Generic; +using System.Linq; + +namespace FarmmapsHaulmkilling.Models +{ + public class HaulmkillingAgent + { + public string Name { get; set; } + public List SupportedOptions { get; set; } + public Dictionary> Values { get; set; } + + public HaulmkillingAgentValue? GetAgentValue(string inputName, string optionKey) + { + if (!Values.ContainsKey(inputName)) + return null; + + var agentDataValues = Values[inputName]; + return agentDataValues.FirstOrDefault(v => v.Option.Equals(optionKey)); + } + } + + public struct HaulmkillingAgentValue + { + public string Option { get; set; } + public float Min { get; set; } + public float Max { get; set; } + public float FMul { get; set; } + public float FExp { get; set; } + } +} \ No newline at end of file