from django.test import TestCase, Client
from django.contrib.auth.models import User
from django.urls import reverse
from django.utils import timezone
from membership.models import Membership
from datetime import timedelta

class MembershipFeaturesTest(TestCase):
    def setUp(self):
        # Create test user
        self.user = User.objects.create_user(
            username='testuser',
            password='testpass123',
            email='test@example.com'
        )
        
        # Create a membership
        self.membership = Membership.objects.create(
            user=self.user,
            first_name='Test',
            last_name='User',
            email='test@example.com',
            date_of_birth=timezone.now().date(),
            membership_type='full',
            membership_status='approved',
            payment_verified=True
        )
        
        self.client = Client()

    def test_membership_number_generation(self):
        """Test that membership number is generated correctly"""
        self.assertTrue(self.membership.membership_number.startswith('FM'))
        self.assertEqual(len(self.membership.membership_number), 8)  # FM000001 format

    def test_membership_number_login(self):
        """Test login with membership number"""
        # Try logging in with membership number
        response = self.client.post(reverse('accounts:login'), {
            'username': self.membership.membership_number,
            'password': 'testpass123'
        })
        self.assertEqual(response.status_code, 302)  # Should redirect after successful login
        
        # Verify we're logged in
        response = self.client.get(reverse('membership:profile'))
        self.assertEqual(response.status_code, 200)

    def test_membership_type_change(self):
        """Test that membership number updates correctly when type changes"""
        old_number = self.membership.membership_number
        old_base = self.membership.base_number
        
        # Change membership type
        self.membership.membership_type = 'associate'
        self.membership.save()
        
        # Check that base number remains same but prefix changes
        self.assertTrue(self.membership.membership_number.startswith('AS'))
        self.assertEqual(self.membership.base_number, old_base)
        self.assertNotEqual(self.membership.membership_number, old_number)

    def test_no_number_before_approval(self):
        """Test that membership number is not generated before approval"""
        membership = Membership.objects.create(
            user=self.user,
            first_name='Test2',
            last_name='User2',
            email='test2@example.com',
            date_of_birth=timezone.now().date(),
            membership_type='full',
            membership_status='pending',
            payment_verified=False
        )
        
        self.assertIsNone(membership.membership_number)
        self.assertIsNone(membership.base_number)

        # Verify payment but don't approve
        membership.payment_verified = True
        membership.save()
        self.assertIsNone(membership.membership_number)

        # Now approve
        membership.membership_status = 'approved'
        membership.save()
        self.assertIsNotNone(membership.membership_number)
        self.assertTrue(membership.membership_number.startswith('FM'))
