# apps/core/services.py (ফিক্সড ভার্সন)
import requests
from django.utils import timezone
import random
from django.conf import settings 
from django.core.mail import EmailMessage
from django.template.loader import render_to_string
from decouple import config

def send_sms(mobile: str, message: str) -> dict:
    payload = {
        "api_key": config('SMS_API_KEY'),
        "senderid": config('SMS_SENDER_ID'),
        "number": mobile,
        "message": message,
    }

    try:
        response = requests.post("http://bulksmsbd.net/api/smsapi", data=payload)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f" Error sending SMS: {e}")
        return {"error": str(e)}


def send_mobile_otp(user, mobile_number):
    user.is_active = False
    user.is_mobile_verified = False
    
    otp_code = str(random.randint(100000, 999999))
    user.otp = otp_code
    user.otp_expires_at = timezone.now() + timezone.timedelta(minutes=5)
    
    message = f"Your OTP is: {otp_code}. It expires in 5 minutes. Do not share this with anyone."
    sms_result = send_sms(mobile_number, message)
    
    user.save()
    
    if "error" in sms_result:
        return False, f"Failed to send SMS: {sms_result['error']}"
    return True, "OTP sent successfully"


def send_email_otp(user, email):
    """Send OTP to user's email - returns (success, message)"""
    user.is_active = False
    user.is_email_verified = False
    
    otp_code = str(random.randint(100000, 999999))
    user.otp = otp_code
    user.otp_expires_at = timezone.now() + timezone.timedelta(minutes=5)
    user.save()

    subject = "OTP for Email Verification"
    
    context = {
        'user': user,
        'otp_code': otp_code,
        'subject': subject,
    }
    
    html_message = render_to_string('email/otp_email.html', context)
    subject = "OTP for verification"

    email_message = EmailMessage(
        subject,
        html_message,
        settings.DEFAULT_FROM_EMAIL, 
        [email],
    )
    email_message.content_subtype = "html"
    
    try:
        email_message.send(fail_silently=False)
        return True, "OTP sent successfully"
    except Exception as e:
        # Email sending failed, but OTP is saved in database
        # User can try to resend OTP later
        return False, f"Failed to send email: {str(e)}"


def verify_otp(user, otp):
    """Verify OTP"""
    if not user.otp or not user.otp_expires_at:
        return False, "OTP not found"
    
    # Convert both to string for comparison
    if str(user.otp) != str(otp):
        return False, "Invalid OTP"
    
    if user.otp_expires_at < timezone.now():
        return False, "OTP has expired"
    
    # Mark email as verified
    user.is_email_verified = True
    user.is_active = True
    user.otp = None
    user.otp_expires_at = None
    user.save()
    
    return True, "Email verified successfully"


def resend_otp(user, email):
    """Resend OTP - wrapper for send_email_otp"""
    return send_email_otp(user, email)