import uuid

from django.forms import ModelForm
from django.db import models
from django.contrib.auth.models import AbstractUser
from django.utils.translation import gettext_lazy as _
from django.contrib.auth.base_user import BaseUserManager



from django.db import models

from django.contrib.auth.models import (
    BaseUserManager,
    AbstractBaseUser,
    PermissionsMixin,
)


class UsersManager(BaseUserManager):
    def create_user(self, email=None, password=None, phone_number=None, **extra_fields):
        """
        Creates and saves a User with the given email, date of
        birth and password.
        """
        if phone_number and not email:
            # For 'Customer' users without email
            user = self.model(
                phone_number=phone_number, user_type="Customer", **extra_fields
            )
        else:
            # For other users who require email and password
            if not email:
                raise ValueError("Users must have an email address")
            user = self.model(email=self.normalize_email(email), **extra_fields)
            user.set_password(password)
        user.save(using=self._db)
        return user

    def create_superuser(self, email, password, **extra_fields):
        """
        Creates and saves a superuser with the given email, date of
        birth and password.
        """
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)
        if extra_fields.get("is_staff") is not True:
            raise ValueError("Super User must be Staff")

        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Super User must be Super User")
        user = self.create_user(email, password=password, **extra_fields)

        return user


class Users(AbstractBaseUser, PermissionsMixin):
    # first_name = models.CharField(max_length=100)
    # last_name = models.CharField(max_length=100, null=True)
    uuid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, unique=True, editable=False
    )

    email = models.EmailField(
        verbose_name="email address", max_length=255, unique=True, null=True, blank=True
    )
    email_verified = models.BooleanField(default=False)
    gender = models.CharField(
        max_length=20,
        choices=[
            ("male", "Male"),
            ("female", "Female"),
            ("prefer_not_to_say", "Prefer Not to Say"),
        ],
        null=True,
        blank=True,
    )
    dob = models.DateField(null=True, blank=True)
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100, null=True, blank=True)
    password = models.CharField(max_length=200)
    phone_number = models.CharField(max_length=100, null=True, blank=True)
    status = models.CharField(
        max_length=30,
        choices=[
            ("active", "active"),
            ("inactive", "inactive"),
            ("suspend", "suspend"),
        ],
    )
    user_verify_status = models.BooleanField(default=False)
    user_type = models.CharField(
        max_length=30,
        choices=[
            ("Super Admin", "Super Admin"),
            ("NBC Admin", "NBC Admin"),
            ("Shop Admin", "Shop Admin"),
            ("PU Admin", "PU Admin"),
            ("Customer", "Customer"),
        ],
    )
    fcm_token = models.CharField(max_length=255, blank=True, null=True)
    last_login_time = models.DateTimeField(blank=True, null=True)
    created_date = models.DateTimeField(auto_now_add=True, null=True)
    updated_date = models.DateTimeField(auto_now=True, null=True)
    is_staff = models.BooleanField(default=False)
    is_superuser = models.BooleanField(default=False)

    objects = UsersManager()

    USERNAME_FIELD = "email"
    REQUIRED_FIELDS = []

    def __str__(self):
        return f"{self.first_name} {self.last_name} - {self.email}"


class OTP(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE)
    otp_code = models.CharField(max_length=6)  # 6-digit OTP
    is_verified = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)


class Address(models.Model):
    user = models.ForeignKey(Users, on_delete=models.CASCADE, related_name="addresses")
    latitude = models.DecimalField(max_digits=9, decimal_places=6)
    longitude = models.DecimalField(max_digits=9, decimal_places=6)
    flat_no = models.CharField(max_length=100)
    landmark = models.CharField(max_length=255, null=True, blank=True)
    address_type = models.CharField(max_length=10, null=True, blank=True)

    def __str__(self):
        return f"{self.flat_no}, {self.landmark}"

class UserLocation(models.Model):
    user = models.ForeignKey(Users, null=True, blank=True, on_delete=models.CASCADE)
    latitude = models.FloatField()
    longitude = models.FloatField()
    shop = models.ForeignKey(
        "shops.Shop", null=True, blank=True, on_delete=models.SET_NULL
    )
    created_at = models.DateTimeField(auto_now_add=True)
    anonymous_id = models.UUIDField(null=True, blank=True)
    address = models.ForeignKey(
        Address, null=True, blank=True, on_delete=models.SET_NULL
    )
    is_selected_address = models.BooleanField(default=False)  
    location_address = models.TextField(null=True, blank=True)

    def __str__(self):
        return f"{self.user.phone_number if self.user else 'Anonymous'}'s location"


class LoggingOperation(models.Model):
    user = models.ForeignKey(Users, null=True, blank=True, on_delete=models.CASCADE)
    log_type =  models.CharField(
        max_length=30,
        choices=[
            ("shop", "shop"),
            ("product", "product"),
        ],
    )
    message = models.CharField(max_length=500, null=True, blank=True)
    description = models.CharField(max_length=500, null= True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)


    def __str__(self):
        return f"{self.user.email if self.user else 'Anonymous'} Operation :{self.message}"

