from datetime import timedelta
from decimal import Decimal

from django.urls import reverse
from django.utils import timezone
from rest_framework import status
from rest_framework.test import APITestCase

from apps.accounts.models import User
from apps.business.marketplace.models_part2 import CartItem, ShoppingCart
from apps.business.orders.models import Order
from apps.business.products.models import Product
from apps.business.wallet.models import SuperCoinWallet, Wallet
from apps.masterdata.platform_setting import PlatformSetting
from apps.payments.models import PaymentTransaction
from apps.platform.settings.models import QRConfig


class RetailCheckoutStatusTests(APITestCase):
    def setUp(self):
        self.user = User.objects.create_user(
            mobile="9000000001",
            email="checkout-status@example.com",
            password="pass@123",
        )
        self.client.force_authenticate(self.user)
        self.url = reverse("web-marketplace-checkout")

        self.billing_address = {
            "label": "Home",
            "name": "Test User",
            "address_line1": "Street 1",
            "address_line2": "Near Landmark",
            "city": "Hyderabad",
            "state": "Telangana",
            "country": "India",
            "postcode": "500001",
            "phone": "9000000001",
        }

    def _prepare_cart(self, *, price="655.00", quantity=1, allow_supercoins=True):
        product = Product.objects.create(
            name="Retail Checkout Product",
            category=Product.Category.PHYSICAL,
            base_cost=Decimal(price),
            gst_percentage=Decimal("18.000"),
            is_active=True,
            marketplace_status="ACTIVE",
            allow_main_wallet=True,
            allow_repurchase=False,
            allow_supercoins=allow_supercoins,
        )

        cart, _ = ShoppingCart.objects.get_or_create(user=self.user)
        CartItem.objects.create(
            cart=cart,
            product=product,
            quantity=quantity,
            unit_price=Decimal(price),
            price_expires_at=timezone.now() + timedelta(hours=1),
        )
        return product

    def test_manual_bank_transfer_keeps_order_in_payment_review(self):
        self._prepare_cart()

        Wallet.objects.create(
            user=self.user,
            main_balance=Decimal("0.00"),
            repurchase_balance=Decimal("0.00"),
            voucher_balance=Decimal("0.00"),
        )
        SuperCoinWallet.objects.create(user=self.user, balance=Decimal("0.00"))

        QRConfig.objects.create(
            company_name="TrueWave",
            is_active=True,
            enable_bank_transfer=True,
            enable_qr_scan=True,
            enable_phonepe=True,
            enable_razorpay=True,
        )

        payload = {
            "billing_address": self.billing_address,
            "shipping_address": self.billing_address,
            "same_as_billing": True,
            "payment_methods": ["bank_transfer"],
            "payment_method": "bank_transfer",
            "transaction_reference": "UTR-TEST-123",
        }

        response = self.client.post(self.url, payload, format="json")

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertTrue(response.data["success"])
        self.assertEqual(response.data["data"]["status"], "PAYMENT_REVIEW")
        self.assertTrue(response.data["data"]["pending_approval"])

        order = Order.objects.get(id=response.data["data"]["order_id"])
        self.assertEqual(order.status, "PAYMENT_REVIEW")
        self.assertEqual(order.payment_method, "bank_transfer")
        self.assertEqual(order.qr_reference, "UTR-TEST-123")

    def test_verified_razorpay_marks_order_completed(self):
        self._prepare_cart()

        Wallet.objects.create(
            user=self.user,
            main_balance=Decimal("0.00"),
            repurchase_balance=Decimal("0.00"),
            voucher_balance=Decimal("0.00"),
        )
        SuperCoinWallet.objects.create(user=self.user, balance=Decimal("0.00"))

        QRConfig.objects.create(
            company_name="TrueWave",
            is_active=True,
            enable_bank_transfer=True,
            enable_qr_scan=True,
            enable_phonepe=True,
            enable_razorpay=True,
        )
        PlatformSetting.set_value("razorpay_test_key_id", "rzp_test_unit")

        payment_txn = PaymentTransaction.objects.create(
            user=self.user,
            provider="razorpay",
            amount=Decimal("655.00"),
            status="success",
            provider_order_id="order_unit_1",
            provider_payment_id="pay_unit_1",
            currency="INR",
        )

        payload = {
            "billing_address": self.billing_address,
            "shipping_address": self.billing_address,
            "same_as_billing": True,
            "payment_methods": ["razorpay"],
            "payment_method": "razorpay",
            "payment_transaction_id": str(payment_txn.id),
        }

        response = self.client.post(self.url, payload, format="json")

        self.assertEqual(response.status_code, status.HTTP_201_CREATED)
        self.assertTrue(response.data["success"])
        self.assertEqual(response.data["data"]["status"], "COMPLETED")
        self.assertFalse(response.data["data"]["pending_approval"])

        order = Order.objects.get(id=response.data["data"]["order_id"])
        self.assertEqual(order.status, "COMPLETED")
        self.assertEqual(order.payment_method, "razorpay")
        self.assertEqual(order.payment_transaction_id, payment_txn.id)
