# Services/TwilioVerify.py
import os
from flask import request, jsonify
from twilio.rest import Client
from twilio.base.exceptions import TwilioRestException

TWILIO_ACCOUNT_SID = "AC7ebaf8127ca7b701f2320e988d63d0cf"
TWILIO_AUTH_TOKEN = "f352d5ff523bdbe17a7f3e52acb7bfef"
TWILIO_VERIFY_SID = "VA930560cea220ac78575f436b4604b521"

# Basic safety check
if not (TWILIO_ACCOUNT_SID and TWILIO_AUTH_TOKEN and TWILIO_VERIFY_SID):
    # Don't raise on import; return errors from endpoints if not set
    client = None
else:
    client = Client(TWILIO_ACCOUNT_SID, TWILIO_AUTH_TOKEN)


def send_otp():
    """
    POST /send_otp
    JSON body: { "to": "+919xxxxxxxx", "channel": "sms" }   # channel optional: "sms" or "call"
    """
    if client is None:
        return jsonify({"error": "Twilio credentials not configured"}), 500

    data = request.get_json(silent=True) or {}
    to = data.get("to")
    channel = data.get("channel", "sms")

    if not to:
        return jsonify({"error": 'missing required field "to" (phone number in E.164 format)'}), 400

    try:
        verification = client.verify.services(TWILIO_VERIFY_SID).verifications.create(
            to=to,
            channel=channel
        )
        return jsonify({"sid": verification.sid, "status": verification.status}), 200
    except TwilioRestException as e:
        return jsonify({"error": str(e), "code": getattr(e, "code", None)}), 502
    except Exception as e:
        return jsonify({"error": str(e)}), 500


def verify_phone_otp():
    """
    POST /verify_otp
    JSON body: { "to": "+919xxxxxxxx", "code": "123456" }
    """
    if client is None:
        return jsonify({"error": "Twilio credentials not configured"}), 500

    data = request.get_json(silent=True) or {}
    to = data.get("to")
    code = data.get("code")

    if not to or not code:
        return jsonify({"error": 'missing required fields "to" and/or "code"'}), 400

    try:
        check = client.verify.services(TWILIO_VERIFY_SID).verification_checks.create(
            to=to,
            code=code
        )
        # check.status will typically be "pending" or "approved"
        return jsonify({"status": check.status, "valid": check.status == "approved"}), 200
    except TwilioRestException as e:
        return jsonify({"error": str(e), "code": getattr(e, "code", None)}), 502
    except Exception as e:
        return jsonify({"error": str(e)}), 500
