from django.test import TestCase, Client
from django.urls import reverse
from django.contrib.auth.models import User
from xygaming_app.models import Header, Category, SubCategory, Product, Profile
from xygaming_app.forms import MyCustomSignupForm

class HomepageAndCategoryTests(TestCase):
    def setUp(self):
        self.client = Client()
        self.header = Header.objects.create(name="Game-Cards")
        self.category = Category.objects.create(
            header=self.header,
            name="Free Fire",
            slug="free-fire",
            featured=True,
            is_bestselling=True
        )
        self.subcategory = SubCategory.objects.create(
            category=self.category,
            name="100 Diamonds Sub",
            slug="100-diamonds-sub"
        )
        self.product = Product.objects.create(
            subcategory=self.subcategory,
            name="100 Diamonds",
            price=100,
            dprice=90,
            slug="100-diamonds"
        )
        self.staff_user = User.objects.create_superuser('admin', 'admin@example.com', 'password123')

    def test_homepage_status_and_content(self):
        response = self.client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertIn('featured', response.context)
        self.assertIn('popular', response.context)
        self.assertEqual(len(response.context['featured']), 1)
        self.assertEqual(len(response.context['popular']), 1)

    def test_custom_signup_form(self):
        form_data = {
            'username': 'testuser',
            'email': 'testuser@example.com',
            'first_name': 'Test',
            'last_name': 'User',
            'phone': '9800000000',
            'password1': 'StrongPass123!',
            'password2': 'StrongPass123!'
        }
        form = MyCustomSignupForm(data=form_data)
        self.assertTrue(form.is_valid(), form.errors)
        user = form.save(self.client)
        self.assertEqual(user.username, 'testuser')
        profile = Profile.objects.filter(user=user).first()
        self.assertIsNotNone(profile)

    def test_admin_category_creation(self):
        self.client.login(username='admin', password='password123')
        response = self.client.post(reverse('categories'), {
            'header': 'Game-Cards',
            'category_name': 'PUBG Mobile',
            'featured': '1',
            'is_bestselling': '1'
        })
        self.assertEqual(response.status_code, 200)
        new_cat = Category.objects.get(name='PUBG Mobile')
        self.assertTrue(new_cat.featured)
        self.assertTrue(new_cat.is_bestselling)

    def test_admin_category_update(self):
        self.client.login(username='admin', password='password123')
        response = self.client.post(reverse('updatecategory', args=[self.category.id]), {
            'category': 'Free Fire Max',
            'header': 'Game-Cards',
            'featured': '0',
            'is_bestselling': '0'
        })
        self.assertEqual(response.status_code, 302)
        self.category.refresh_from_db()
        self.assertEqual(self.category.name, 'Free Fire Max')
        self.assertFalse(self.category.featured)
        self.assertFalse(self.category.is_bestselling)

    def test_mainbanner_multi_upload_and_update(self):
        from django.core.files.uploadedfile import SimpleUploadedFile
        from xygaming_app.models import MainBanner

        self.client.login(username='admin', password='password123')
        
        img1 = SimpleUploadedFile("banner1.jpg", b"fake_image_1", content_type="image/jpeg")
        img2 = SimpleUploadedFile("banner2.jpg", b"fake_image_2", content_type="image/jpeg")
        
        initial_count = MainBanner.objects.count()
        response = self.client.post(reverse('mainbanners'), {
            'img': [img1, img2],
            'link': 'https://xygame.co/promo',
            'is_mobileview': '0'
        })
        self.assertEqual(response.status_code, 302)
        self.assertEqual(MainBanner.objects.count(), initial_count + 2)
        
        banner = MainBanner.objects.latest('id')
        self.assertEqual(banner.link, 'https://xygame.co/promo')
        self.assertFalse(banner.is_mobileview)
        
        response = self.client.post(reverse('updatemainbanner', args=[banner.id]), {
            'link': 'https://xygame.co/new-promo',
            'is_mobileview': '1'
        })
        self.assertEqual(response.status_code, 302)
        banner.refresh_from_db()
        self.assertEqual(banner.link, 'https://xygame.co/new-promo')
        self.assertTrue(banner.is_mobileview)

    def test_banner_strict_mobile_desktop_separation(self):
        from django.core.files.uploadedfile import SimpleUploadedFile
        from xygaming_app.models import MainBanner

        # Clean any existing banners in this test
        MainBanner.objects.all().delete()

        # Case 1: Only desktop banner exists -> mobile is empty, does not show desktop banner
        img = SimpleUploadedFile("desktop.jpg", b"fake_desktop", content_type="image/jpeg")
        b1 = MainBanner.objects.create(image=img, link="https://xygame.co", is_mobileview=False)
        response = self.client.get(reverse('index'))
        self.assertEqual(response.status_code, 200)
        self.assertIn(b1, list(response.context['mainbanners']))
        self.assertEqual(len(list(response.context['mainbanners1'])), 0)
        self.assertContains(response, 'id="mobilenoshow"')
        self.assertNotContains(response, 'id="mobilenoshow1"')

        # Case 2: Dedicated mobile banner exists -> mobile has only mobile banner, desktop has only desktop
        img2 = SimpleUploadedFile("mobile.jpg", b"fake_mobile", content_type="image/jpeg")
        b2 = MainBanner.objects.create(image=img2, link="https://xygame.co/mobile", is_mobileview=True)
        response = self.client.get(reverse('index'))
        self.assertIn(b1, list(response.context['mainbanners']))
        self.assertNotIn(b2, list(response.context['mainbanners']))
        self.assertIn(b2, list(response.context['mainbanners1']))
        self.assertNotIn(b1, list(response.context['mainbanners1']))
        self.assertContains(response, 'id="mobilenoshow"')
        self.assertContains(response, 'id="mobilenoshow1"')

