#!/usr/bin/env python3
"""
Make an outbound call using Twilio and connect to Rivet voice assistant
"""

import os
import sys
from dotenv import load_dotenv
from twilio.rest import Client
from loguru import logger

load_dotenv()

def make_outbound_call(to_number: str, from_number: str = None):
    """
    Make an outbound call and connect to voice assistant
    
    Args:
        to_number: Phone number to call (E.164 format, e.g., +61426246472)
        from_number: Twilio number to call from (defaults to env var)
    """
    
    # Get Twilio credentials
    account_sid = os.getenv("TWILIO_ACCOUNT_SID")
    auth_token = os.getenv("TWILIO_AUTH_TOKEN")
    twilio_number = from_number or os.getenv("TWILIO_PHONE_NUMBER")
    websocket_url = os.getenv("PUBLIC_URL", "http://134.199.153.159:8765")
    
    if not all([account_sid, auth_token, twilio_number]):
        logger.error("Missing Twilio credentials in .env")
        sys.exit(1)
    
    # Create Twilio client
    client = Client(account_sid, auth_token)
    
    # TwiML to connect call to websocket
    twiml = f'''<?xml version="1.0" encoding="UTF-8"?>
<Response>
    <Say voice="alice">Connecting you to Rivet</Say>
    <Connect>
        <Stream url="wss://{websocket_url.replace('http://', '').replace('https://', '')}/media-stream">
            <Parameter name="aCustomParameter" value="customValue"/>
        </Stream>
    </Connect>
</Response>'''
    
    logger.info(f"Making call from {twilio_number} to {to_number}")
    logger.info(f"Websocket URL: {websocket_url}/media-stream")
    
    try:
        call = client.calls.create(
            to=to_number,
            from_=twilio_number,
            twiml=twiml,
            status_callback=f"{websocket_url}/call-status",
            status_callback_event=['initiated', 'ringing', 'answered', 'completed']
        )
        
        logger.success(f"✅ Call initiated: {call.sid}")
        logger.info(f"Status: {call.status}")
        logger.info(f"Call URL: https://console.twilio.com/voice/calls/{call.sid}")
        
        return call.sid
        
    except Exception as e:
        logger.error(f"❌ Failed to make call: {e}")
        sys.exit(1)


def main():
    """Main entry point"""
    
    if len(sys.argv) < 2:
        print("Usage: python make_call.py <phone_number>")
        print("Example: python make_call.py +61426246472")
        sys.exit(1)
    
    to_number = sys.argv[1]
    
    # Validate phone number format
    if not to_number.startswith('+'):
        logger.error("Phone number must be in E.164 format (e.g., +61426246472)")
        sys.exit(1)
    
    make_outbound_call(to_number)


if __name__ == "__main__":
    main()
