#!/usr/bin/env python3
"""
Riyadh District Distance Finder
Query nearest districts to any district in Riyadh.
"""
import sys
from riyadh_districts import get_all_districts, get_district_info, search_districts
from distance_calculator import (
get_nearest_districts,
get_farthest_districts,
calculate_distance_between_districts,
)
def print_header():
print("\n" + "=" * 60)
print(" šļø RIYADH DISTRICT DISTANCE FINDER šļø")
print("=" * 60)
def find_nearest(district_name: str, count: int = 5):
"""Find and display nearest districts."""
# Try to find the district
info = get_district_info(district_name)
if not info:
# Try searching for partial matches
matches = search_districts(district_name)
if matches:
print(f"\nā District '{district_name}' not found exactly.")
print("Did you mean one of these?")
for m in matches[:5]:
print(f" - {m['name']} ({m['name_ar']})")
return None
else:
print(f"\nā District '{district_name}' not found.")
print("Use --list to see all available districts.")
return None
# Get nearest districts
nearest = get_nearest_districts(info["name"], count)
print(f"\nš {info['name']} ({info['name_ar']})")
print(f" Coordinates: {info['lat']}, {info['lng']}")
print(f"\nšÆ Top {count} Nearest Districts:")
print("-" * 50)
for i, d in enumerate(nearest, 1):
print(f" {i:2}. {d['name']:22} ({d['name_ar']:12}) - {d['distance_km']:5.2f} km")
return nearest
def list_all_districts():
"""List all available districts."""
districts = sorted(get_all_districts())
print(f"\nš All {len(districts)} Riyadh Districts:")
print("-" * 50)
for i, name in enumerate(districts, 1):
info = get_district_info(name)
print(f" {i:2}. {name} ({info['name_ar']})")
def distance_between(district1: str, district2: str):
"""Calculate distance between two districts."""
try:
dist = calculate_distance_between_districts(district1, district2)
info1 = get_district_info(district1)
info2 = get_district_info(district2)
print(f"\nš Distance Calculation:")
print("-" * 50)
print(f" From: {info1['name']} ({info1['name_ar']})")
print(f" To: {info2['name']} ({info2['name_ar']})")
print(f" Distance: {dist:.2f} km")
return dist
except ValueError as e:
print(f"\nā Error: {e}")
return None
def main():
print_header()
if len(sys.argv) < 2:
print("\nUsage:")
print(" python main.py <district_name> - Find 5 nearest districts")
print(" python main.py <district_name> --top 10 - Find 10 nearest districts")
print(" python main.py --list - List all districts")
print(" python main.py --distance <d1> <d2> - Distance between two districts")
print("\nExamples:")
print(" python main.py 'Al Olaya'")
print(" python main.py 'Al Malaz' --top 10")
print(" python main.py --distance 'Al Olaya' 'Al Hayr'")
return
if sys.argv[1] == "--list":
list_all_districts()
return
if sys.argv[1] == "--distance":
if len(sys.argv) < 4:
print("ā Please provide two district names.")
return
distance_between(sys.argv[2], sys.argv[3])
return
# Default: find nearest districts
district_name = sys.argv[1]
count = 5
# Check for --top argument
if "--top" in sys.argv:
try:
top_idx = sys.argv.index("--top")
count = int(sys.argv[top_idx + 1])
except (ValueError, IndexError):
print("ā Invalid --top value. Using default of 5.")
find_nearest(district_name, count)
if __name__ == "__main__":
main()