#!/usr/bin/env python3
"""
Setup LiveKit SIP Dispatch Rule
This script creates a dispatch rule to route incoming calls to your agent
"""
import asyncio
import os
from dotenv import load_dotenv
from livekit import api

# Load environment variables
load_dotenv(".env.local")

async def create_dispatch_rule():
    """Create a dispatch rule to route calls to the agent"""
    
    livekit_url = os.getenv("LIVEKIT_URL")
    livekit_key = os.getenv("LIVEKIT_API_KEY")
    livekit_secret = os.getenv("LIVEKIT_API_SECRET")
    twilio_phone = os.getenv("TWILIO_PHONE_NUMBER")
    
    if not all([livekit_url, livekit_key, livekit_secret, twilio_phone]):
        print("❌ Missing required environment variables")
        return
    
    print(f"🔧 Creating dispatch rule for {twilio_phone}...")
    
    livekit_api = api.LiveKitAPI(
        url=livekit_url,
        api_key=livekit_key,
        api_secret=livekit_secret
    )
    
    try:
        # First, list existing trunks to get the trunk ID
        print("   Finding inbound trunk...")
        trunks = await livekit_api.sip.list_sip_inbound_trunk(
            api.ListSIPInboundTrunkRequest()
        )
        
        trunk_id = None
        for trunk in trunks.items:
            if twilio_phone in trunk.numbers:
                trunk_id = trunk.sip_trunk_id
                print(f"   Found trunk: {trunk.name} (ID: {trunk_id})")
                break
        
        if not trunk_id:
            print(f"❌ No inbound trunk found for {twilio_phone}")
            print(f"   Run setup_sip_trunk.py first to create the trunk")
            return
        
        # Create dispatch rule
        # This rule will:
        # 1. Match calls to your Twilio number
        # 2. Create a room for each call
        # 3. Dispatch the "default" agent to handle the call
        
        rule = api.SIPDispatchRuleInfo(
            name="Twilio to Agent",
            trunk_ids=[trunk_id],
            rule=api.SIPDispatchRule(
                dispatch_rule_direct=api.SIPDispatchRuleDirect(
                    room_name="",  # Empty = auto-generate room name
                    pin="",  # No PIN required
                )
            ),
            # Metadata to pass to the agent (optional)
            # You can customize the agent behavior per call
            attributes={
                "agent_name": "default",  # Must match @server.rtc_session(agent_name="default")
            }
        )
        
        request = api.CreateSIPDispatchRuleRequest(rule=rule)
        result = await livekit_api.sip.create_sip_dispatch_rule(request)
        
        print(f"✅ Dispatch rule created successfully!")
        print(f"   Rule ID: {result.sip_dispatch_rule_id}")
        print(f"   Name: {result.name}")
        print(f"   Trunk IDs: {result.trunk_ids}")
        print(f"\n🎉 Setup complete! Your agent is ready to receive calls.")
        print(f"\n📞 Test it:")
        print(f"   1. Make sure your agent is running: python3 -m src.agent")
        print(f"   2. Call your Twilio number: {twilio_phone}")
        print(f"   3. The agent should answer and start talking!")
        
    except Exception as e:
        if "already exists" in str(e).lower():
            print(f"ℹ️  Dispatch rule already exists")
            print(f"   You can view it in the LiveKit dashboard")
        else:
            print(f"❌ Error creating dispatch rule: {e}")
    
    finally:
        await livekit_api.aclose()

async def list_dispatch_rules():
    """List all existing dispatch rules"""
    
    livekit_url = os.getenv("LIVEKIT_URL")
    livekit_key = os.getenv("LIVEKIT_API_KEY")
    livekit_secret = os.getenv("LIVEKIT_API_SECRET")
    
    livekit_api = api.LiveKitAPI(
        url=livekit_url,
        api_key=livekit_key,
        api_secret=livekit_secret
    )
    
    try:
        print("\n📋 Listing existing dispatch rules...")
        rules = await livekit_api.sip.list_sip_dispatch_rule(
            api.ListSIPDispatchRuleRequest()
        )
        
        if not rules.items:
            print("   No dispatch rules found")
        else:
            for rule in rules.items:
                print(f"\n   Rule: {rule.name}")
                print(f"   ID: {rule.sip_dispatch_rule_id}")
                print(f"   Trunk IDs: {rule.trunk_ids}")
        
    except Exception as e:
        print(f"❌ Error listing rules: {e}")
    
    finally:
        await livekit_api.aclose()

async def main():
    print("=" * 60)
    print("LiveKit SIP Dispatch Rule Setup")
    print("=" * 60)
    
    # List existing rules first
    await list_dispatch_rules()
    
    # Create new rule
    await create_dispatch_rule()
    
    print("\n" + "=" * 60)

if __name__ == "__main__":
    asyncio.run(main())
