using CommandLine;
using StackExchange.Redis;
using System;
using System.Collections.Generic;
using System.Linq;
using RedisManager.Utils;
namespace RedisManager.Commands
{
///
/// Contains command line options and implementations for Redis geospatial operations.
/// Provides functionality for GEOADD, GEORADIUS, GEODIST, GEOHASH, and GEOPOS commands.
///
[Verb("geoadd", HelpText = "Add one or more geospatial items to a key.")]
public class GeoAddOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "key", Required = true, HelpText = "Key name.")]
public string Key { get; set; }
[Value(1, MetaName = "members", Min = 3, Required = true, HelpText = "Members with longitude,latitude,name format.")]
public IEnumerable Members { get; set; }
}
[Verb("georadius", HelpText = "Query a sorted set representing a geospatial index to fetch members matching a given maximum distance from a point.")]
public class GeoRadiusOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "key", Required = true, HelpText = "Key name.")]
public string Key { get; set; }
[Value(1, MetaName = "longitude", Required = true, HelpText = "Longitude.")]
public double Longitude { get; set; }
[Value(2, MetaName = "latitude", Required = true, HelpText = "Latitude.")]
public double Latitude { get; set; }
[Value(3, MetaName = "radius", Required = true, HelpText = "Radius.")]
public double Radius { get; set; }
[Option("unit", Default = "m", HelpText = "Unit (m, km, mi, ft).")]
public string Unit { get; set; }
[Option("withcoord", HelpText = "Include coordinates in output.")]
public bool WithCoord { get; set; }
[Option("withdist", HelpText = "Include distance in output.")]
public bool WithDist { get; set; }
[Option("withhash", HelpText = "Include hash in output.")]
public bool WithHash { get; set; }
[Option("count", HelpText = "Limit results count.")]
public int Count { get; set; }
[Option("asc", HelpText = "Sort ascending by distance.")]
public bool Asc { get; set; }
[Option("desc", HelpText = "Sort descending by distance.")]
public bool Desc { get; set; }
}
[Verb("geodist", HelpText = "Return the distance between two members of a geospatial index.")]
public class GeoDistOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "key", Required = true, HelpText = "Key name.")]
public string Key { get; set; }
[Value(1, MetaName = "member1", Required = true, HelpText = "First member.")]
public string Member1 { get; set; }
[Value(2, MetaName = "member2", Required = true, HelpText = "Second member.")]
public string Member2 { get; set; }
[Option("unit", Default = "m", HelpText = "Unit (m, km, mi, ft).")]
public string Unit { get; set; }
}
[Verb("geohash", HelpText = "Returns members of a geospatial index as standard geohash strings.")]
public class GeoHashOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "key", Required = true, HelpText = "Key name.")]
public string Key { get; set; }
[Value(1, MetaName = "members", Min = 1, Required = true, HelpText = "Members.")]
public IEnumerable Members { get; set; }
}
[Verb("geopos", HelpText = "Returns longitude and latitude of members of a geospatial index.")]
public class GeoPosOptions
{
[Option('i', "instance", Required = true, HelpText = "Instance name.")]
public string Instance { get; set; }
[Value(0, MetaName = "key", Required = true, HelpText = "Key name.")]
public string Key { get; set; }
[Value(1, MetaName = "members", Min = 1, Required = true, HelpText = "Members.")]
public IEnumerable Members { get; set; }
}
public static class GeoCommands
{
///
/// Executes the GEOADD command to add one or more geospatial items to a key.
///
/// The GeoAddOptions containing instance, key, and members.
/// The RedisManager configuration.
/// Exit code (0 for success, non-zero for failure).
public static int RunGeoAdd(GeoAddOptions opts, Config config)
{
var instance = RedisUtils.GetInstance(config, opts.Instance);
using var redis = RedisUtils.ConnectRedis(instance);
var db = redis.GetDatabase();
var args = new List