import logging
import stripe
from django.conf import settings
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework import status

from package_details.models.package_details import PackageDetails
from package_payment.models.payment import Payment

from django.views.decorators.csrf import csrf_exempt
from django.utils.decorators import method_decorator
from django.http import HttpResponse
from user_ads_package.models.userpackage import UserPackage

from django.shortcuts import redirect

logger = logging.getLogger(__name__)



stripe.api_key = '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'


class CreateCheckoutSessionView(APIView):
    def post(self, request):
        package_id = request.data.get("package_id")
        user = request.user

        try:
            package = PackageDetails.objects.get(id=package_id)

            if package.price.lower() == "free" or float(package.price) <= 0:
                # Check if free package already exists for this user
                existing_payment = Payment.objects.filter(
                    user=user,
                    package=package,
                    stripe_payment_intent="free_package"
                ).first()
                
                if existing_payment:
                    logger.warning(f"Free package already applied for user {user.id}")
                    return Response(
                        {"error": "Free package already applied to your account"},
                        status=status.HTTP_400_BAD_REQUEST
                    )
                
                user_package, created = UserPackage.objects.get_or_create(
                    user=user,
                    defaults={
                        "package": package,
                        "total_ads": package.total_ads,
                        "total_space": package.space,
                    },
                )

                if not created:
                    user_package.total_ads += package.total_ads
                    user_package.total_space += package.space
                    user_package.package = package
                    user_package.save()
                    logger.info(f"Upgraded package for user {user.id}")

                Payment.objects.create(
                    user=user,
                    package=package,
                    stripe_payment_intent="free_package",
                    amount=0,
                    status="succeeded"
                )

                success_url = f'https://panjabiz.com/panjabiz/ads/checkout/success?package={package.category.name}&price={package.price}&total_ads={package.total_ads}&total_space={package.space}&status=success'
                
                return Response({"session_url": success_url}, status=status.HTTP_200_OK)

            checkout_session = stripe.checkout.Session.create(
                payment_method_types=["card"],
                line_items=[
                    {
                        "price_data": {
                            "currency": "usd",
                            "product_data": {"name": package.category.name},
                            "unit_amount": int(float(package.price) * 100),  
                        },
                        "quantity": 1,
                    }
                ],
                mode="payment",
                success_url="https://api.panjabiz.com/api/package-payment/success?session_id={CHECKOUT_SESSION_ID}",
                cancel_url="https://panjabiz.com/panjabiz/ads/checkout/failed",
                customer_email=user.email,
                metadata={
                    "user_id": str(user.id),
                    "package_id": str(package.id)
                },
            )

            Payment.objects.create(
                user=user,
                package=package,
                stripe_payment_intent=checkout_session.id,  
                amount=float(package.price),
                status="pending"
            )

            return Response({"session_url": checkout_session.url}, status=status.HTTP_200_OK)

        except PackageDetails.DoesNotExist:
            return Response({"error": "Package not found"}, status=status.HTTP_404_NOT_FOUND)
        except Exception as e:
            logger.error(f"Checkout session creation error: {str(e)}")
            return Response({"error": str(e)}, status=status.HTTP_400_BAD_REQUEST)


class PackagePaymentSuccessView(APIView):
    """
    Auto-verify package payment and redirect to frontend
    GET /api/package-payment/success?session_id=xxx
    This is called automatically by Stripe after successful payment
    """
    permission_classes = []  
    
    def get(self, request):
        session_id = request.query_params.get('session_id')
        
        if not session_id:
            logger.error("Missing session_id in payment success callback")
            return redirect('https://panjabiz.com/panjabiz/ads/checkout/failed?error=missing_session')
        
        try:
            session = stripe.checkout.Session.retrieve(session_id)
            
            user_id = session.metadata.get('user_id')
            package_id = session.metadata.get('package_id')
            
            if not user_id or not package_id:
                logger.error(f"Missing metadata in session {session_id}")
                return redirect('https://panjabiz.com/panjabiz/ads/checkout/failed?error=invalid_metadata')
            
            if session.payment_status == 'paid':
                payment_intent_id = session.get('payment_intent')
                
               
                payment = Payment.objects.filter(
                    stripe_payment_intent=session_id,
                    user_id=user_id,
                    package_id=package_id
                ).first()
                
                if not payment:
                    package = PackageDetails.objects.get(id=package_id)
                    from users.models.users import User
                    user = User.objects.get(id=user_id)
                    
                    payment = Payment.objects.create(
                        user=user,
                        package=package,
                        stripe_payment_intent=payment_intent_id or session_id,
                        amount=package.price,
                        status="succeeded"
                    )
                    logger.info(f"Created new payment record for session {session_id}")
                else:
                    if payment.status != 'succeeded':
                        payment.status = 'succeeded'
                        payment.stripe_payment_intent = payment_intent_id or session_id
                        payment.save()
                        logger.info(f"Updated payment {payment.id} to succeeded")
                
                package = PackageDetails.objects.get(id=package_id)
                from users.models.users import User
                user = User.objects.get(id=user_id)
                
                user_package, created = UserPackage.objects.get_or_create(
                    user=user,
                    defaults={
                        "package": package,
                        "total_ads": package.total_ads,
                        "total_space": package.space,
                    },
                )

                if not created:
                    user_package.total_ads += package.total_ads
                    user_package.total_space += package.space
                    user_package.package = package
                    user_package.save()
                    logger.info(f"Upgraded package for user {user_id}")
                else:
                    logger.info(f"Created new package for user {user_id}")

                return redirect(f'https://panjabiz.com/panjabiz/ads/checkout/success?package={package.category.name}&price={package.price}&total_ads={package.total_ads}&total_space={package.space}&transactionid={payment_intent_id}&status=success')

            else:
                logger.warning(f"Payment not completed for session {session_id}, status: {session.payment_status}")
                return redirect(f'https://panjabiz.com/panjabiz/ads/checkout/pending?status={session.payment_status}')
                
        except stripe.error.StripeError as e:
            logger.error(f"Stripe error during payment verification: {str(e)}")
            return redirect('https://panjabiz.com/panjabiz/ads/checkout/failed?error=stripe_error')

        except PackageDetails.DoesNotExist:
            logger.error(f"Package {package_id} not found")
            return redirect('https://panjabiz.com/panjabiz/ads/checkout/failed?error=package_not_found')
            
        except Exception as e:
            logger.error(f"Payment verification error: {str(e)}")
            return redirect('https://panjabiz.com/panjabiz/ads/checkout/failed?error=unknown')



@method_decorator(csrf_exempt, name='dispatch')
class StripeWebhookView(APIView):
    def post(self, request, *args, **kwargs):
        payload = request.body
        sig_header = request.META.get("HTTP_STRIPE_SIGNATURE")
        endpoint_secret = "sk_test_51SDLA6HWwVmn6nLt7Ve6N7mb3bzYSUqvd3QZaNJ6wvsKqUpaSXjAL3xwSefBaxA1BWc5PitXFM5XXJZYHmZFom8O00xtDQmIBb"

        try:
            event = stripe.Webhook.construct_event(
                payload, sig_header, endpoint_secret
            )
        except ValueError:
            return Response(status=status.HTTP_400_BAD_REQUEST)
        except stripe.error.SignatureVerificationError:
            return Response(status=status.HTTP_400_BAD_REQUEST)

        # ✅ When payment is successful
        if event["type"] == "checkout.session.completed":
            session = event["data"]["object"]
            user_id = session["metadata"]["user_id"]
            package_id = session["metadata"]["package_id"]

            # Update payment record
            payment_intent = session.get("payment_intent")

            try:
                payment = Payment.objects.get(stripe_payment_intent=payment_intent)
                payment.status = "paid"
                payment.save()

                # Create or update UserPackage
                package = PackageDetails.objects.get(id=package_id)
                user = payment.user

                user_package, created = UserPackage.objects.get_or_create(
                    user=user,
                    defaults={
                        "package": package,
                        "total_ads": package.total_ads,
                        "total_space": package.space,
                    },
                )

                if not created:
                    # Upgrade existing package
                    user_package.total_ads += package.total_ads
                    user_package.total_space += package.space
                    user_package.package = package
                    user_package.save()

            except Payment.DoesNotExist:
                print("Payment cant be created")

        return Response(status=status.HTTP_200_OK)