"""Agent 4 — Booking Agent (writes to data/bookings.json)""" import json, uuid, os from datetime import datetime, timedelta from pathlib import Path BOOKINGS_FILE = Path(__file__).parent.parent / "data" / "bookings.json" TIME_SLOT_MAP = { "morning": ["09:00", "10:00", "11:00"], "afternoon": ["13:00", "14:00", "15:00"], "evening": ["17:00", "18:00", "19:00"], "asap": ["09:00", "10:00", "11:00", "13:00", "14:00"], } def pick_slot(provider: dict, requested_time: str) -> str: available = provider.get("available_slots", []) rt = (requested_time or "").lower() for key, slots in TIME_SLOT_MAP.items(): if key in rt: for s in slots: if s in available: return s return available[0] if available else "10:00" def run(recommendation: dict, intent: dict) -> dict: provider = recommendation.get("best_provider") if not provider: return {"error": "No provider available to book."} slot = pick_slot(provider, intent.get("time", "morning")) booking_id = f"BK-{datetime.now().strftime('%Y%m%d')}-{str(uuid.uuid4())[:5].upper()}" remind_time = f"{int(slot.split(':')[0]) - 1:02d}:{slot.split(':')[1]}" booked_date = (datetime.now() + timedelta(days=1)).strftime("%A, %d %b %Y") record = { "booking_id": booking_id, "provider_id": provider["provider_id"], "provider_name": provider["name"], "service": intent.get("service_type"), "location": intent.get("location"), "confirmed_slot": slot, "booked_date": booked_date, "provider_phone": provider.get("phone"), "reminder_time": remind_time, "created_at": datetime.now().isoformat(), "status": "confirmed", } # Write to bookings.json try: existing = json.loads(BOOKINGS_FILE.read_text()) if BOOKINGS_FILE.exists() else [] existing.append(record) BOOKINGS_FILE.write_text(json.dumps(existing, indent=2)) except Exception: pass # HF free tier ephemeral filesystem — non-fatal return record