using System.Collections.Generic; using Microsoft.Extensions.Logging; using SmartNav.Model.Navigation; namespace SmartNav.Data; public sealed class ZoneSubRegionService { private readonly Dictionary _regions = new Dictionary(); public IReadOnlyDictionary AllRegions => _regions; public ZoneSubRegionService(SmartNavDataOptions dataOptions, ILogger logger) { foreach (var (s, value) in AssemblyZoneSubRegionLoader.GetRegions(dataOptions.DevSourceDirectory?.FullName)) { if (uint.TryParse(s, out var result)) { _regions[result] = value; } } logger.LogDebug("ZoneSubRegionService: {Count} territories with sub-regions loaded", _regions.Count); } public bool HasSubRegions(uint territoryId) { return _regions.ContainsKey(territoryId); } public string? GetSubRegionId(uint territoryId, float x, float y, float z) { if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value)) { return null; } foreach (SubRegionDefinition subRegion in value.SubRegions) { if (subRegion.Contains(x, y, z)) { return subRegion.Id; } } return "_default"; } public IReadOnlyList? GetSubRegions(uint territoryId) { if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value)) { return null; } return value.SubRegions; } public IReadOnlyList? GetConnectors(uint territoryId) { if (!_regions.TryGetValue(territoryId, out TerritorySubRegions value)) { return null; } return value.Connectors; } }