from django.db import models
from django.contrib.auth.models import BaseUserManager, AbstractBaseUser
from django.utils import timezone  
from django.db.models.signals import post_migrate
from django.dispatch import receiver
from utils.helper import failed_response
from allauth.socialaccount.models import SocialAccount

def get_user_profile_image(user):
    social_account = SocialAccount.objects.get(user=user)
    profile_image_url = social_account.extra_data.get('picture')
    return profile_image_url

class UserManager(BaseUserManager):
    def create_user(self, username, email, password=None, first_name='', last_name='', pan_number='', phone_number=None, **extra_fields):
        if not email:
            raise failed_response(msg="User must have an email address")
        if not username:
            raise failed_response(msg="User must have a username")
            
        email = self.normalize_email(email)
        user = self.model(
            username=username,
            email=email,
            first_name=first_name,
            last_name=last_name,
            pan_number=pan_number,
            phone_number=phone_number,
            **extra_fields
        )
        user.set_password(password)
        user.is_active = False  # User starts as inactive until email is verified
        user.save(using=self.db)
        
        try:
            profile_image_url = get_user_profile_image(user)
            user.profile_img = profile_image_url
        except SocialAccount.DoesNotExist:
            user.profile_img = None
        user.save(using=self.db)
        return user

class User(AbstractBaseUser):
    first_name = models.CharField(max_length=50, blank=True, null=True)
    last_name = models.CharField(max_length=50, blank=True, null=True)
    middle_name = models.CharField(max_length=50, blank=True, null=True)
    username = models.CharField(max_length=25, unique=True)
    email = models.EmailField(max_length=100, unique=True)
    password = models.CharField(max_length=129)
    is_active = models.BooleanField(default=False)  # Changed from verified to is_active
    pan_number = models.CharField(null=True)
    profile_img = models.CharField(max_length=255, blank=True, null=True)
    email_verified_at = models.DateTimeField(blank=True, null=True)
    created_at = models.DateTimeField(default=timezone.now)
    updated_at = models.DateTimeField(default=timezone.now)
    usertype = models.ForeignKey('usertype', on_delete=models.CASCADE, null=True, blank=True)
    phone_number = models.CharField(max_length=10, unique=True)

    objects = UserManager()

    USERNAME_FIELD = 'username'
    REQUIRED_FIELDS = ['email', 'first_name']

    class Meta:
        db_table = 'user'

class EmailVerification(models.Model):
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    code = models.CharField(max_length=6)
    created_at = models.DateTimeField(auto_now_add=True)
    expires_at = models.DateTimeField()
    is_used = models.BooleanField(default=False)

    class Meta:
        db_table = 'email_verification'


class usertype(models.Model):
    type = models.CharField(max_length=25)
    subtype = models.IntegerField()

    def __str__(self):
        return self.type  

    class Meta:
        db_table = 'user_type'


def insert_default_usertype():
    default_usertypes = [
        {'type':'Institution','subtype':1},
        {'type':'Company','subtype':2},
        {'type':'Individual','subtype':3}
        
    ]
    for usertype_data in default_usertypes:
        usertype.objects.get_or_create(type=usertype_data['type'],defaults={'subtype':usertype_data['subtype']})


@receiver(post_migrate)
def insert_usertypes_on_migration(sender, **kwargs):
    insert_default_usertype()
        

class CodeConfirmation(models.Model):
    EMAIL_CHANGE = 'email_change'
    EMAIL_CONFIRMATION = 'email_confirmation'
    PASSWORD_RESET = 'password_reset'
    TYPE_CHOICES = [
        (EMAIL_CHANGE, 'email_change'),
        (EMAIL_CONFIRMATION, 'Email Confirmation'),
        (PASSWORD_RESET, 'Password Reset'),
    ]
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True)
    type = models.CharField(max_length=20, choices=TYPE_CHOICES)
    pending = models.BooleanField(default=True)
    code = models.CharField(max_length=20)
    email = models.EmailField(max_length=100)

    class Meta:
        db_table = 'code_confirmation'
        # unique_together = ('email', 'type')