from django.shortcuts import render, get_object_or_404, redirect
from django.contrib import messages
from django.http import JsonResponse
from django.db.models import Sum
from .models import Product, MainCategory, Category, Cart, CartItem
from azbankgateways import bankfactories, models as bank_models, default_settings as settings
from azbankgateways.exceptions import AZBankGatewaysException
from django.http import HttpResponse, HttpResponseRedirect
from django.utils import timezone
import json

# ---------- صفحه اصلی ----------
def home_view(request):
    """صفحه اصلی با دسته‌بندی‌ها"""
    main_categories = MainCategory.objects.filter(is_active=True).order_by('order')
    
    # محصولات جدید برای نمایش در خانه
    new_products = Product.objects.all().order_by('-created_at')[:8]
    
    return render(request, 'home.html', {
        'main_categories': main_categories,
        'new_products': new_products,
    })

# ---------- محصولات دسته‌بندی خاص ----------
def category_products_view(request, main_category_id):
    """نمایش محصولات یک دسته‌بندی خاص"""
    main_category = get_object_or_404(MainCategory, id=main_category_id, is_active=True)
    products = Product.objects.filter(main_category=main_category).order_by('-created_at')
    
    return render(request, 'shop/category_products.html', {
        'main_category': main_category,
        'products': products,
    })

# ---------- محصولات زیردسته ----------
def subcategory_products_view(request, subcategory_id):
    """نمایش محصولات یک زیردسته خاص"""
    subcategory = get_object_or_404(Category, id=subcategory_id)
    products = Product.objects.filter(category=subcategory).order_by('-created_at')
    
    return render(request, 'shop/subcategory_products.html', {
        'subcategory': subcategory,
        'products': products,
        'main_category': subcategory.main_category,
    })

# ---------- جزئیات محصول ----------
def product_detail_view(request, product_id):
    """صفحه جزئیات محصول"""
    product = get_object_or_404(Product, id=product_id)
    
    # محصولات مرتبط (از همان دسته‌بندی)
    related_products = Product.objects.filter(
        main_category=product.main_category
    ).exclude(id=product_id)[:4]
    
    return render(request, 'shop/product_detail.html', {
        'product': product,
        'related_products': related_products,
    })

# ---------- مدیریت سبد خرید ----------
def get_or_create_cart(request):
    """دریافت یا ایجاد سبد خرید"""
    if request.user.is_authenticated:
        cart, created = Cart.objects.get_or_create(user=request.user)
    else:
        cart_id = request.session.get('cart_id')
        if cart_id:
            cart = Cart.objects.filter(id=cart_id).first()
            if not cart:
                cart = Cart.objects.create(user=None)
                request.session['cart_id'] = cart.id
        else:
            cart = Cart.objects.create(user=None)
            request.session['cart_id'] = cart.id
    return cart

def cart_view(request):
    """نمایش سبد خرید"""
    cart = get_or_create_cart(request)
    cart_items = cart.items.all() if cart else []
    
    total = 0
    for item in cart_items:
        total += item.product.price * item.quantity
    
    return render(request, 'shop/cart.html', {
        'cart_items': cart_items,
        'total': total,
    })

def add_to_cart_view(request, product_id):
    """افزودن محصول به سبد خرید"""
    if request.method == 'POST':
        try:
            product = get_object_or_404(Product, id=product_id)
            cart = get_or_create_cart(request)
            
            quantity = int(request.POST.get('quantity', 1))
            
            # بررسی آیا محصول در سبد وجود دارد
            cart_item, created = CartItem.objects.get_or_create(
                cart=cart,
                product=product,
                defaults={'quantity': quantity}
            )
            
            if not created:
                cart_item.quantity += quantity
                cart_item.save()
                message = f'تعداد محصول "{product.name}" افزایش یافت.'
            else:
                message = f'محصول "{product.name}" به سبد خرید اضافه شد.'
            
            messages.success(request, message)
            
            # اگر درخواست AJAX باشد
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                cart_count = cart.items.aggregate(total=Sum('quantity'))['total'] or 0
                return JsonResponse({
                    'success': True,
                    'message': message,
                    'cart_count': cart_count,
                })
            
            return redirect('shop:cart')
                
        except Exception as e:
            error_message = f'خطا در افزودن محصول: {str(e)}'
            messages.error(request, error_message)
            
            if request.headers.get('X-Requested-With') == 'XMLHttpRequest':
                return JsonResponse({
                    'success': False,
                    'message': error_message
                })
    
    return redirect('shop:product_detail', product_id=product_id)

def update_cart_item_view(request, item_id):
    """به‌روزرسانی تعداد محصول در سبد خرید"""
    if request.method == 'POST':
        try:
            cart = get_or_create_cart(request)
            cart_item = get_object_or_404(CartItem, id=item_id, cart=cart)
            
            action = request.POST.get('action')
            
            if action == 'increase':
                cart_item.quantity += 1
                cart_item.save()
                messages.success(request, f'تعداد "{cart_item.product.name}" افزایش یافت.')
            elif action == 'decrease':
                if cart_item.quantity > 1:
                    cart_item.quantity -= 1
                    cart_item.save()
                    messages.success(request, f'تعداد "{cart_item.product.name}" کاهش یافت.')
                else:
                    cart_item.delete()
                    messages.success(request, 'محصول از سبد خرید حذف شد.')
            
        except Exception as e:
            messages.error(request, f'خطا در به‌روزرسانی سبد خرید: {e}')
    
    return redirect('shop:cart')

def remove_from_cart_view(request, item_id):
    """حذف محصول از سبد خرید"""
    try:
        cart = get_or_create_cart(request)
        cart_item = get_object_or_404(CartItem, id=item_id, cart=cart)
        product_name = cart_item.product.name
        cart_item.delete()
        messages.success(request, f'محصول "{product_name}" از سبد خرید حذف شد.')
    except Exception as e:
        messages.error(request, f'خطا در حذف محصول: {e}')
    
    return redirect('shop:cart')

def get_cart_count_view(request):
    """دریافت تعداد آیتم‌های سبد خرید"""
    try:
        cart = get_or_create_cart(request)
        cart_count = cart.items.aggregate(total=Sum('quantity'))['total'] or 0
        return JsonResponse({
            'success': True,
            'cart_count': cart_count
        })
    except:
        return JsonResponse({
            'success': False,
            'cart_count': 0
        })

def checkout_view(request):
    """صفحه تسویه حساب"""
    # اگر کاربر لاگین نیست
    if not request.user.is_authenticated:
        request.session['next_url'] = 'shop:checkout'
        messages.info(request, "لطفاً ابتدا وارد حساب کاربری خود شوید")
        return redirect('accounts:request_otp')
    
    # اگر پروفایل کامل نیست
    if not request.user.is_profile_complete:
        request.session['next_url'] = 'shop:checkout'
        messages.info(request, "لطفاً ابتدا اطلاعات خود را تکمیل کنید")
        return redirect('accounts:complete_profile')
    
    cart = get_or_create_cart(request)
    cart_items = cart.items.all() if cart else []
    
    if not cart_items:
        messages.warning(request, "سبد خرید شما خالی است")
        return redirect('shop:cart')
    
    # محاسبه مجموع قیمت محصولات
    subtotal = 0
    for item in cart_items:
        subtotal += item.product.price * item.quantity
    
    # دریافت تنظیمات فروشگاه
    from .models import ShopSettings
    try:
        settings = ShopSettings.objects.first()
        if not settings:
            settings = ShopSettings.objects.create(shipping_cost=50000, free_shipping_threshold=500000)
    except:
        settings = ShopSettings(shipping_cost=50000, free_shipping_threshold=500000)
    
    # محاسبه هزینه ارسال
    shipping_cost = settings.shipping_cost
    if settings.free_shipping_threshold and subtotal >= settings.free_shipping_threshold:
        shipping_cost = 0
    
    total = subtotal + shipping_cost
    
    # 🔍 برای دیباگ - توی ترمینال نشون بده
    print(f"📊 subtotal: {subtotal}, shipping_cost: {shipping_cost}, total: {total}")
    
    if request.method == 'POST':
        full_name = request.POST.get('full_name')
        phone = request.POST.get('phone')
        email = request.POST.get('email', '')
        province = request.POST.get('province', '')
        city = request.POST.get('city', '')
        postal_code = request.POST.get('postal_code')
        shipping_address = request.POST.get('shipping_address')
        notes = request.POST.get('notes', '')
        
        # اعتبارسنجی
        errors = []
        if not full_name:
            errors.append("نام و نام خانوادگی الزامی است")
        if not phone:
            errors.append("شماره تماس الزامی است")
        elif not phone.startswith('09') or len(phone) != 11 or not phone.isdigit():
            errors.append("شماره تماس باید ۱۱ رقم و با 09 شروع شود")
        if not postal_code:
            errors.append("کد پستی الزامی است")
        elif not postal_code.isdigit() or len(postal_code) != 10:
            errors.append("کد پستی باید دقیقاً ۱۰ رقم باشد")
        if not shipping_address:
            errors.append("آدرس کامل الزامی است")
        
        if errors:
            for error in errors:
                messages.error(request, error)
            return render(request, 'shop/checkout.html', {
                'cart_items': cart_items,
                'subtotal': subtotal,
                'shipping_cost': shipping_cost,
                'total': total,
                'user': request.user,
                'settings': settings,
            })
        
        try:
            from django.db import transaction
            from orders.models import Order, OrderItem, Payment
            
            with transaction.atomic():
                # ایجاد سفارش
                order = Order.objects.create(
                    user=request.user,
                    total_price=total,
                    status='pending',
                    full_name=full_name,
                    phone=phone,
                    email=email,
                    shipping_address=shipping_address,
                    postal_code=postal_code,
                    city=city,
                    province=province,
                    notes=notes,
                )
                
                # ایجاد آیتم‌های سفارش
                for cart_item in cart_items:
                    OrderItem.objects.create(
                        order=order,
                        product=cart_item.product,
                        quantity=cart_item.quantity,
                        price=cart_item.product.price
                    )
                
                # ایجاد رکورد پرداخت
                Payment.objects.create(
                    order=order,
                    amount=total,
                    status='pending',
                    gateway='zarinpal'
                )
                
                # پاک کردن سبد خرید
                cart_items.delete()
                
                messages.success(request, f"سفارش #{order.order_number} با موفقیت ایجاد شد")
                return redirect('shop:payment_gateway', order_id=order.id)
                
        except Exception as e:
            messages.error(request, f"خطا در ایجاد سفارش: {str(e)}")
            return redirect('shop:cart')
    
    return render(request, 'shop/checkout.html', {
        'cart_items': cart_items,
        'subtotal': subtotal,
        'shipping_cost': shipping_cost,
        'total': total,
        'user': request.user,
        'settings': settings,
    })

# ---------- سیستم سفارش و پرداخت ----------
def create_order_view(request):
    """ایجاد سفارش از سبد خرید"""
    if request.method == 'POST':
        if not request.user.is_authenticated:
            messages.error(request, "برای پرداخت ابتدا وارد حساب کاربری خود شوید")
            return redirect('accounts:request_otp')
        
        # دریافت سبد خرید
        cart = get_or_create_cart(request)
        cart_items = cart.items.all()
        
        if not cart_items.exists():
            messages.error(request, "سبد خرید شما خالی است")
            return redirect('shop:cart')
        
        try:
            from django.db import transaction
            from orders.models import Order, OrderItem, Payment
            
            with transaction.atomic():
                # محاسبه مجموع
                total_price = sum(item.product.price * item.quantity for item in cart_items)
                
                # ایجاد سفارش
                order = Order.objects.create(
                    user=request.user,
                    total_price=total_price,
                    status='pending',
                    full_name=request.user.full_name or request.POST.get('full_name', ''),
                    phone=request.user.phone,
                    email=request.user.email or '',
                    shipping_address=request.user.detailed_address or request.POST.get('address', ''),
                    postal_code=request.user.postal_code or request.POST.get('postal_code', ''),
                    city='',
                    province='',
                )
                
                # ایجاد آیتم‌های سفارش
                for cart_item in cart_items:
                    OrderItem.objects.create(
                        order=order,
                        product=cart_item.product,
                        quantity=cart_item.quantity,
                        price=cart_item.product.price
                    )
                
                # ایجاد رکورد پرداخت
                payment = Payment.objects.create(
                    order=order,
                    amount=total_price,
                    status='pending',
                    gateway='zarinpal'
                )
                
                # پاک کردن سبد خرید
                cart_items.delete()
                
                messages.success(request, "سفارش با موفقیت ایجاد شد. لطفا پرداخت را انجام دهید.")
                return redirect('shop:payment_gateway', order_id=order.id)
                
        except Exception as e:
            messages.error(request, f"خطا در ایجاد سفارش: {str(e)}")
            return redirect('shop:cart')
    
    return redirect('shop:checkout')

def payment_gateway_view(request, order_id):
    """صفحه درگاه پرداخت"""
    if not request.user.is_authenticated:
        request.session['next_url'] = 'shop:payment_gateway'
        messages.info(request, "لطفاً ابتدا وارد حساب کاربری خود شوید")
        return redirect('accounts:request_otp')
    
    try:
        from orders.models import Order
        order = Order.objects.get(id=order_id, user=request.user)
        
        if order.status != 'pending':
            messages.warning(request, "این سفارش قبلاً پرداخت شده است")
            return redirect('shop:order_detail', order_id=order.id)
        
        return render(request, 'shop/payment.html', {
            'order': order,
        })
        
    except Order.DoesNotExist:
        messages.error(request, "سفارش یافت نشد")
        return redirect('shop:cart')

def go_to_zarinpal_view(request, order_id):
    """هدایت به درگاه زرین‌پال"""
    try:
        # اعتبارسنجی سفارش
        order = Order.objects.get(id=order_id, user=request.user)
        
        if order.status != 'pending':
            messages.error(request, "این سفارش قبلاً پرداخت شده است")
            return redirect('shop:order_detail', order_id=order.id)
        
        # دریافت یا ایجاد پرداخت
        try:
            payment = Payment.objects.get(order=order)
        except Payment.DoesNotExist:
            payment = Payment.objects.create(
                order=order,
                amount=order.total_price,
                status='pending',
                gateway='zarinpal'
            )
        
        # تنظیمات درگاه
        from azbankgateways import bankfactories, models as bank_models
        
        factory = bankfactories.BankFactory()
        
        # ساخت callback URL داینامیک
        callback_url = request.build_absolute_uri(f'/shop/order/{order.id}/zarinpal/callback/')
        
        # اطلاعات اضافی برای درگاه
        additional_data = {
            'mobile': order.phone,
            'email': order.email or request.user.email,
            'description': f'پرداخت سفارش {order.order_number}',
        }
        
        bank = factory.create(
            bank_models.BankType.ZARINPAL,
            amount=int(order.total_price),  # مبلغ به ریال
            user=request.user,
            callback_url=callback_url,
            additional_data=additional_data,
        )
        
        bank.set_request(request)
        result = bank.ready()
        
        if result:
            # ذخیره authority در رکورد پرداخت
            tracking_code = bank.factory.get('tracking_code')
            payment.authority = tracking_code
            payment.save()
            
            # ذخیره در سشن
            request.session['zarinpal_authority'] = tracking_code
            
            # هدایت به درگاه
            return bank.redirect_gateway()
        else:
            messages.error(request, "خطا در اتصال به درگاه پرداخت")
            return redirect('shop:payment_gateway', order_id=order.id)
            
    except Order.DoesNotExist:
        messages.error(request, "سفارش یافت نشد")
        return redirect('shop:cart')
    except Exception as e:
        messages.error(request, f"خطا در سیستم پرداخت: {str(e)}")
        return redirect('shop:payment_gateway', order_id=order_id)

def zarinpal_callback_view(request, order_id):
    """بازگشت از درگاه زرین‌پال"""
    try:
        # اعتبارسنجی سفارش
        order = Order.objects.get(id=order_id)
        payment = Payment.objects.get(order=order)
        
        # دریافت کد پیگیری
        from azbankgateways import default_settings as settings
        tracking_code = request.GET.get(settings.TRACKING_CODE_QUERY_PARAM, None)
        
        if not tracking_code:
            messages.error(request, "کد پیگیری یافت نشد")
            return redirect('shop:order_detail', order_id=order.id)
        
        # پیدا کردن رکورد بانک
        from azbankgateways import models as bank_models
        bank_record = bank_models.Bank.objects.get(tracking_code=tracking_code)
        
        # ذخیره پاسخ درگاه
        payment.gateway_response = {
            'tracking_code': tracking_code,
            'bank_data': str(bank_record),
            'request_data': dict(request.GET),
            'received_at': timezone.now().isoformat(),
        }
        
        # بررسی وضعیت پرداخت
        if bank_record.is_success:
            # پرداخت موفق
            payment.status = 'success'
            payment.ref_id = bank_record.reference_number if hasattr(bank_record, 'reference_number') else ''
            payment.transaction_id = tracking_code
            payment.paid_at = timezone.now()
            payment.description = f"پرداخت موفق - Ref: {payment.ref_id}"
            payment.save()
            
            # آپدیت سفارش
            order.status = 'paid'
            order.payment_date = payment.paid_at
            order.save()
            
            # پاک کردن سبد خرید
            cart = get_or_create_cart(request)
            cart.items.all().delete()
            
            # حذف اطلاعات از سشن
            for key in ['order_id', 'payment_id', 'zarinpal_authority']:
                if key in request.session:
                    del request.session[key]
            
            messages.success(request, f"""
                ✅ پرداخت با موفقیت انجام شد!
                
                **شماره سفارش:** {order.order_number}
                **کد پیگیری:** {payment.ref_id}
                **مبلغ پرداخت شده:** {order.total_price:,} تومان
                
                سفارش شما در حال پردازش است.
            """)
            return redirect('shop:order_success', order_id=order.id)
            
        else:
            # پرداخت ناموفق
            payment.status = 'failed'
            payment.description = "پرداخت ناموفق بود یا توسط کاربر لغو شد"
            payment.save()
            
            order.status = 'cancelled'
            order.save()
            
            messages.error(request, """
                ❌ پرداخت ناموفق بود!
                
                دلیل احتمالی:
                • عدم تأیید پرداخت توسط بانک
                • لغو توسط کاربر
                • خطا در ارتباط با درگاه
                
                لطفا مجدداً تلاش کنید یا با پشتیبانی تماس بگیرید.
            """)
            return redirect('shop:order_detail', order_id=order.id)
            
    except Order.DoesNotExist:
        messages.error(request, "سفارش یافت نشد")
        return redirect('shop:cart')
    except Payment.DoesNotExist:
        messages.error(request, "اطلاعات پرداخت یافت نشد")
        return redirect('shop:cart')
    except Exception as e:
        messages.error(request, f"خطا در پردازش پرداخت: {str(e)}")
        return redirect('shop:cart')

def order_success_view(request, order_id):
    """صفحه موفقیت پرداخت"""
    try:
        order = Order.objects.get(id=order_id)
        
        # بررسی دسترسی
        if order.user != request.user:
            messages.error(request, "دسترسی غیرمجاز")
            return redirect('shop:home')
        
        # دریافت اطلاعات پرداخت
        payment = Payment.objects.filter(order=order).first()
        
        return render(request, 'shop/order_success.html', {
            'order': order,
            'payment': payment,
        })
        
    except Order.DoesNotExist:
        messages.error(request, "سفارش یافت نشد")
        return redirect('shop:cart')

def order_detail_view(request, order_id):
    """جزئیات سفارش"""
    try:
        order = Order.objects.get(id=order_id)
        
        # بررسی دسترسی
        if order.user != request.user and not request.user.is_staff:
            messages.error(request, "دسترسی غیرمجاز")
            return redirect('shop:home')
        
        payment = Payment.objects.filter(order=order).first()
        order_items = order.items.all()
        
        return render(request, 'shop/order_detail.html', {
            'order': order,
            'payment': payment,
            'order_items': order_items,
        })
        
    except Order.DoesNotExist:
        messages.error(request, "سفارش یافت نشد")
        return redirect('shop:cart')

def user_orders_view(request):
    """لیست سفارش‌های کاربر"""
    if not request.user.is_authenticated:
        return redirect('admin:login')
    
    orders = Order.objects.filter(user=request.user).order_by('-created_at')
    
    return render(request, 'shop/user_orders.html', {
        'orders': orders,
    })



def payment_success(request):
    """صفحه پرداخت موفق - نسخه ساده"""
    from django.shortcuts import render
    return render(request, 'shop/payment_success.html')

def payment_failed(request):
    """صفحه پرداخت ناموفق - نسخه ساده"""
    from django.shortcuts import render
    return render(request, 'shop/payment_failed.html')

def callback_gateway_view(request):
    """بازگشت از زرین‌پال"""
    from django.http import HttpResponse
    return HttpResponse("""
    <html dir='rtl'>
    <head><title>بازگشت از زرین‌پال</title></head>
    <body style='padding: 50px; text-align: center;'>
        <h1>💎 بازگشت از زرین‌پال</h1>
        <p>این صفحه callback زرین‌پال است.</p>
        <a href="/">بازگشت به خانه</a>
    </body>
    </html>
    """)