from django.shortcuts import render, get_object_or_404, redirect
from django.contrib.auth.decorators import login_required
from django.contrib import messages
from django.utils import timezone
from store.models import Cart, CartItem
from .models import Order, OrderItem, UserProfile
import urllib.parse
from django.conf import settings





from django.core.mail import EmailMultiAlternatives
from django.template.loader import render_to_string
from django.utils.html import strip_tags

def checkout(request):
    cart = Cart.objects.filter(user=request.user).first()
    if not cart or not cart.items.exists():
        messages.warning(request, 'Your cart is empty.')
        return redirect('store:shop')

    profile = getattr(request.user, 'profile', None)

    if request.method == 'POST':
        delivery = request.POST.get('delivery_option', 'standard')
        delivery_costs = {'standard': 1500, 'express': 3000, 'pickup': 0}
        delivery_cost = delivery_costs.get(delivery, 1500)

        # Create Order Record
        order = Order.objects.create(
            user=request.user,
            full_name=request.POST.get('full_name'),
            email=request.POST.get('email'),
            phone=request.POST.get('phone'),
            address=request.POST.get('address'),
            city=request.POST.get('city'),
            state=request.POST.get('state'),
            postal_code=request.POST.get('postal_code', ''),
            delivery_option=delivery,
            delivery_cost=delivery_cost,
            payment_method='whatsapp',
            coupon=cart.coupon,
            discount_amount=cart.discount_amount,
            subtotal=cart.total,
            total=cart.total_after_coupon + delivery_cost,
            notes=request.POST.get('notes', ''),
        )

        # Build items list for WhatsApp and collect objects for the template
        item_details_text = ""
        order_items = []
        for item in cart.items.all():
            oi = OrderItem.objects.create(
                order=order,
                product=item.product,
                product_name=item.product.name,
                product_price=item.product.effective_price,
                quantity=item.quantity,
                size=item.size,
                color=item.color,
            )
            order_items.append(oi)
            
            variant = f" ({item.size}/{item.color})" if item.size or item.color else ""
            item_details_text += f"• {item.product.name}{variant} x{item.quantity} - ₦{item.product.effective_price * item.quantity:,.2f}\n"

        order.status = 'pending'
        order.save()

        # --- EMAIL NOTIFICATION LOGIC ---
        try:
            subject = f"Order Confirmation #{order.order_number}"
            from_email = settings.DEFAULT_FROM_EMAIL
            
            # Send copy to the buyer and BCC the website owner
            recipient_list = [order.email]
            bcc_list = [settings.ADMIN_ORDER_EMAIL] # Define your business email here
            
            # Context dictionary to feed the HTML template layout
            email_context = {
                'order': order,
                'items': order_items,
            }
            
            # Render templates
            html_content = render_to_string('orders/emails/order_confirmation.html', email_context)
            text_content = strip_tags(html_content) # Fallback for text-only clients
            
            email = EmailMultiAlternatives(
                subject=subject,
                body=text_content,
                from_email=from_email,
                to=recipient_list,
                bcc=bcc_list
            )
            email.attach_alternative(html_content, "text/html")
            email.send(fail_silently=True) 
        except Exception as e:
            # Keep processing even if email configuration fails temporarily
            pass

        # --- WHATSAPP REDIRECTION LOGIC ---
        whatsapp_msg = (
            f"╔══════════════════════╗\n"
            f"   🛍️  NEW ORDER  🛍️\n"
            f"╚══════════════════════╝\n\n"
            f"📋 *ORDER #{order.order_number}*\n"
            f"━━━━━━━━━━━━━━━━━━━━━━\n\n"
            f"👤 *CUSTOMER DETAILS*\n"
            f"• Name: {order.full_name}\n"
            f"• Phone: {order.phone}\n\n"
            f"📦 *DELIVERY INFO*\n"
            f"• Method: {order.delivery_option.title()}\n"
            f"• Address: {order.address}\n"
            f"• City: {order.city}, {order.state}\n\n"
            f"🛒 *ORDER ITEMS*\n"
            f"━━━━━━━━━━━━━━━━━━━━━━\n"
            f"{item_details_text}\n"
            f"━━━━━━━━━━━━━━━━━━━━━━\n\n"
            f"💳 *PAYMENT SUMMARY*\n"
            f"• Subtotal:      ₦{order.subtotal:>10,.2f}\n"
            f"• Delivery Fee:  ₦{order.delivery_cost:>10,.2f}\n"
            f"• Discount:     -₦{order.discount_amount:>10,.2f}\n"
            f"┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄┄\n"
            f"💰 *TOTAL:        ₦{order.total:>10,.2f}*\n\n"
            + (f"📝 *Customer Notes*\n_{order.notes}_\n\n" if order.notes else "")
            + f"✅ _Please confirm payment to process this order._"
        )

        encoded_msg = urllib.parse.quote(whatsapp_msg, safe='', encoding='utf-8')
        owner_phone = getattr(settings, 'WHATSAPP_OWNER_NUMBER', '2348139776072') 
        whatsapp_url = f"https://wa.me/{owner_phone}?text={encoded_msg}"
        
        
        # whatsapp_url = f"https://wa.me/{owner_phone}?text={encoded_msg}"

        # Clear Cart
        cart.items.all().delete()
        cart.coupon = None
        cart.save()

        # Store url in session to let intermediate template launch it in a new tab safely
        request.session['latest_whatsapp_url'] = whatsapp_url

        messages.success(request, f'Order #{order.order_number} processed!')
        return redirect('orders:order_detail', order_number=order.order_number)

    context = {
        'cart': cart,
        'profile': profile,
        'user': request.user,
    }
    return render(request, 'orders/checkout.html', context)

# @login_required
# def checkout(request):
#     cart = Cart.objects.filter(user=request.user).first()
#     if not cart or not cart.items.exists():
#         messages.warning(request, 'Your cart is empty.')
#         return redirect('store:shop')

#     profile = getattr(request.user, 'profile', None)

#     if request.method == 'POST':
#         delivery = request.POST.get('delivery_option', 'standard')
#         delivery_costs = {'standard': 1500, 'express': 3000, 'pickup': 0}
#         delivery_cost = delivery_costs.get(delivery, 1500)

#         # 1. Create the Order in your database
#         order = Order.objects.create(
#             user=request.user,
#             full_name=request.POST.get('full_name'),
#             email=request.POST.get('email'),
#             phone=request.POST.get('phone'),
#             address=request.POST.get('address'),
#             city=request.POST.get('city'),
#             state=request.POST.get('state'),
#             postal_code=request.POST.get('postal_code', ''),
#             delivery_option=delivery,
#             delivery_cost=delivery_cost,
#             payment_method=request.POST.get('payment_method', 'whatsapp'),
#             coupon=cart.coupon,
#             discount_amount=cart.discount_amount,
#             subtotal=cart.total,
#             total=cart.total_after_coupon + delivery_cost,
#             notes=request.POST.get('notes', ''),
#         )

#         # 2. Build the item lines and save OrderItems
#         item_details_text = ""
#         for item in cart.items.all():
#             OrderItem.objects.create(
#                 order=order,
#                 product=item.product,
#                 product_name=item.product.name,
#                 product_price=item.product.effective_price,
#                 quantity=item.quantity,
#                 size=item.size,
#                 color=item.color,
#             )
            
#             # Append item details for the text message
#             variant_info = f" ({item.size}/{item.color})" if item.size or item.color else ""
#             item_details_text += f"• {item.product.name}{variant_info} x{item.quantity} - ₦{item.product.effective_price * item.quantity:,.2f}\n"

#         order.status = 'pending'
#         order.save()

#         # 3. Construct the WhatsApp Message Business Copy
#         whatsapp_msg = (
#             f"⚡ *NEW ORDER PLACED* ⚡\n\n"
#             f"*Order Number:* #{order.order_number}\n"
#             f"*Customer Name:* {order.full_name}\n"
#             f"*Phone:* {order.phone}\n"
#             f"*Delivery Method:* {order.delivery_option.title()}\n"
#             f"*Address:* {order.address}, {order.city}, {order.state}\n\n"
#             f"🛒 *ITEMS:* \n"
#             f"{item_details_text}\n"
#             f"*Subtotal:* ₦{order.subtotal:,.2f}\n"
#             f"*Delivery Fee:* ₦{order.delivery_cost:,.2f}\n"
#             f"*Discount:* -₦{order.discount_amount:,.2f}\n"
#             f"💰 *Total Payable:* *₦{order.total:,.2f}*\n\n"
#             f"*Customer Notes:* {order.notes if order.notes else 'None'}\n\n"
#             f"Please reply with payment confirmation details to process this order."
#         )

#         # URL encode the text string securely
#         encoded_msg = urllib.parse.quote(whatsapp_msg)
        
#         # 4. Define Owner's Phone Number (Must include country code, no +, no spaces. e.g., '2348012345678')
#         # Ideally set this in your settings.py file
#         owner_phone = getattr(settings, 'WHATSAPP_OWNER_NUMBER', '2348000000000') 
        
#         whatsapp_url = f"https://wa.me/{owner_phone}?text={encoded_msg}"

#         # 5. Clear the customer's cart
#         request.session['latest_whatsapp_url'] = whatsapp_url

#         # Clear the cart
#         cart.items.all().delete()
#         cart.coupon = None
#         cart.save()

#         messages.success(request, f'Order #{order.order_number} placed successfully!')
#         return redirect('orders:order_detail', order_number=order.order_number)

#     context = {
#         'cart': cart,
#         'profile': profile,
#         'user': request.user,
#     }
#     return render(request, 'orders/checkout.html', context)


# @login_required
# def checkout(request):
#     cart = Cart.objects.filter(user=request.user).first()
#     if not cart or not cart.items.exists():
#         messages.warning(request, 'Your cart is empty.')
#         return redirect('store:shop')

#     # Prefill from profile
#     profile = getattr(request.user, 'profile', None)

#     if request.method == 'POST':
#         delivery = request.POST.get('delivery_option', 'standard')
#         delivery_costs = {'standard': 1500, 'express': 3000, 'pickup': 0}
#         delivery_cost = delivery_costs.get(delivery, 1500)

#         order = Order.objects.create(
#             user=request.user,
#             full_name=request.POST.get('full_name'),
#             email=request.POST.get('email'),
#             phone=request.POST.get('phone'),
#             address=request.POST.get('address'),
#             city=request.POST.get('city'),
#             state=request.POST.get('state'),
#             postal_code=request.POST.get('postal_code', ''),
#             delivery_option=delivery,
#             delivery_cost=delivery_cost,
#             payment_method=request.POST.get('payment_method', 'paystack'),
#             coupon=cart.coupon,
#             discount_amount=cart.discount_amount,
#             subtotal=cart.total,
#             total=cart.total_after_coupon + delivery_cost,
#             notes=request.POST.get('notes', ''),
#         )

#         for item in cart.items.all():
#             OrderItem.objects.create(
#                 order=order,
#                 product=item.product,
#                 product_name=item.product.name,
#                 product_price=item.product.effective_price,
#                 quantity=item.quantity,
#                 size=item.size,
#                 color=item.color,
#             )

#         # Mark as paid for cash on delivery or bank transfer (demo)
#         if order.payment_method in ('cash_on_delivery', 'bank_transfer'):
#             order.status = 'pending'
#         else:
#             order.status = 'pending'
#         order.save()

#         # Clear cart
#         cart.items.all().delete()
#         cart.coupon = None
#         cart.save()

#         messages.success(request, f'Order #{order.order_number} placed successfully!')
#         return redirect('orders:order_detail', order_number=order.order_number)

#     context = {
#         'cart': cart,
#         'profile': profile,
#         'user': request.user,
#     }
#     return render(request, 'orders/checkout.html', context)


@login_required
def order_list(request):
    orders = Order.objects.filter(user=request.user)
    return render(request, 'orders/order_list.html', {'orders': orders})


@login_required
def order_detail(request, order_number):
    order = get_object_or_404(Order, order_number=order_number, user=request.user)
    whatsapp_url = request.session.pop('latest_whatsapp_url', None)
    
    return render(request, 'orders/order_detail.html', {
        'order': order,
        'whatsapp_url': whatsapp_url
    })


@login_required
def cancel_order(request, order_number):
    order = get_object_or_404(Order, order_number=order_number, user=request.user)
    if order.can_cancel:
        order.status = 'cancelled'
        order.save()
        messages.success(request, f'Order #{order.order_number} has been cancelled.')
    else:
        messages.error(request, 'This order cannot be cancelled.')
    return redirect('orders:order_detail', order_number=order_number)


@login_required
def profile(request):
    user = request.user
    profile_obj, _ = UserProfile.objects.get_or_create(user=user)
    orders = Order.objects.filter(user=user)[:5]

    # for stats
    all_orders = Order.objects.filter(user=user)

    # for 2FA status
    from users.models import UserOTPProfile
    from django.db.models import Sum
    otp_profile = UserOTPProfile.objects.filter(user=user).first()

    if request.method == 'POST':
        user.first_name = request.POST.get('first_name', '')
        user.last_name  = request.POST.get('last_name', '')
        user.email      = request.POST.get('email', '')
        user.save()
        profile_obj.phone   = request.POST.get('phone', '')
        profile_obj.address = request.POST.get('address', '')
        profile_obj.city    = request.POST.get('city', '')
        profile_obj.state   = request.POST.get('state', '')
        if 'avatar' in request.FILES:
            profile_obj.avatar = request.FILES['avatar']
        profile_obj.save()
        messages.success(request, 'Profile updated successfully!')
        return redirect('orders:profile')

    context = {
        'profile':           profile_obj,
        'recent_orders':     orders,
        'otp_profile':       otp_profile,
        'orders_count':      all_orders.count(),
        'delivered_count':   all_orders.filter(status='delivered').count(),
        'total_spent':       all_orders.aggregate(t=Sum('total'))['t'] or 0,
        'open_security_tab': request.GET.get('tab') == 'security',
    }
    return render(request, 'orders/profile.html', context)
