File size: 1,615 Bytes
59ce1e2
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
"""Agent 2 — Discovery Agent (haversine distance, no Maps API needed on free tier)"""
import json, math, os
from pathlib import Path

PROVIDERS_FILE = Path(__file__).parent.parent / "data" / "providers.json"

AREA_COORDS = {
    "G-13": (33.6844, 73.0479), "G-11": (33.6938, 73.0551),
    "G-10": (33.7020, 73.0397), "G-9":  (33.6995, 73.0440),
    "G-6":  (33.7290, 73.0935), "F-10": (33.7077, 73.0354),
    "F-7":  (33.7192, 73.0587), "E-11": (33.7215, 73.0194),
    "I-8":  (33.6741, 73.0632), "I-10": (33.6800, 73.0530),
    "DEFAULT": (33.6844, 73.0479),
}

def haversine(lat1, lon1, lat2, lon2) -> float:
    R = 6371
    dlat = math.radians(lat2 - lat1)
    dlon = math.radians(lon2 - lon1)
    a = math.sin(dlat/2)**2 + math.cos(math.radians(lat1)) * math.cos(math.radians(lat2)) * math.sin(dlon/2)**2
    return round(R * 2 * math.asin(math.sqrt(a)), 2)

def run(intent: dict) -> dict:
    service_type = intent.get("service_type") or ""
    location     = (intent.get("location") or "DEFAULT").upper().strip()

    with open(PROVIDERS_FILE) as f:
        all_providers = json.load(f)

    user_lat, user_lng = AREA_COORDS.get(location, AREA_COORDS["DEFAULT"])

    matched = []
    for p in all_providers:
        cats = [c.lower() for c in p.get("service_categories", [])]
        if service_type.lower() in cats:
            dist = haversine(user_lat, user_lng, p["location"]["lat"], p["location"]["lng"])
            matched.append({**p, "distance_km": dist})

    matched.sort(key=lambda x: x["distance_km"])
    return {"providers": matched, "user_location": location, "total_found": len(matched)}