import os
import logging
from decimal import Decimal
from apps.masterdata.platform_setting import PlatformSetting

logger = logging.getLogger(__name__)


def _active_mode() -> str:
    mode = PlatformSetting.get_value('razorpay_active_mode', 'test')
    return mode if mode in {'test', 'live'} else 'test'


def _get_active_credentials() -> tuple[str, str]:
    mode = _active_mode()
    key_id = PlatformSetting.get_value(f'razorpay_{mode}_key_id', '').strip()
    key_secret = PlatformSetting.get_value(f'razorpay_{mode}_key_secret', '').strip()

    # Backward compatibility with env-based setup.
    if key_id and key_secret:
        return key_id, key_secret

    env_key_id = os.getenv('RAZORPAY_KEY_ID', '').strip()
    env_key_secret = os.getenv('RAZORPAY_KEY_SECRET', '').strip()
    return env_key_id, env_key_secret


def get_active_webhook_secret() -> str:
    mode = _active_mode()
    configured = PlatformSetting.get_value(f'razorpay_{mode}_webhook_secret', '').strip()
    if configured:
        return configured
    return os.getenv('RAZORPAY_WEBHOOK_SECRET', '').strip()


def _get_client():
    try:
        import razorpay
    except Exception:
        raise RuntimeError('razorpay package is required. pip install razorpay')

    key_id, key_secret = _get_active_credentials()
    if not key_id or not key_secret:
        raise RuntimeError('Razorpay credentials are not configured for active mode. Set test/live keys in Admin Settings.')
    return razorpay.Client(auth=(key_id, key_secret))


def create_order(amount, currency='INR'):
    """Create a Razorpay order. `amount` expected as Decimal or number in major currency units (eg. rupees).

    Returns the order dict returned by Razorpay.
    """
    client = _get_client()
    # convert to smallest currency unit (paise for INR)
    amt = Decimal(amount)
    amt_paise = int((amt * 100).quantize(Decimal('1')))
    data = {
        'amount': amt_paise,
        'currency': currency,
        'payment_capture': 1,
    }
    order = client.order.create(data=data)
    logger.debug('Razorpay order created: %s', order)
    return order


def verify_payment_signature(payment_id, order_id, signature):
    """Verify a Razorpay payment signature using the SDK utility.

    Returns True if valid, raises otherwise.
    """
    client = _get_client()
    try:
        client.utility.verify_payment_signature({
            'razorpay_order_id': order_id,
            'razorpay_payment_id': payment_id,
            'razorpay_signature': signature,
        })
        return True
    except Exception as exc:
        logger.exception('Razorpay signature verification failed')
        raise
