from django.contrib.auth.models import  BaseUserManager
from django.db import models
from django.db.models import CharField, Value, F, QuerySet
from django.db.models.functions import Concat



class UserQuerySet(models.QuerySet):
    def annotate_full_name(self):
        return self.annotate(full_name=Concat(F('first_name'), Value(' '), F('last_name'), output_field=CharField()))
    
    def filter_employee(self):
        return self.select_related('role').filter(role__name='employee')


class UserManager(BaseUserManager):
    def create_user(self, phone_no, password=None, email=None,  **extra_fields):
        if phone_no is None:
            raise TypeError('Users should have a Phone Number')

        user = self.model(email=self.normalize_email(email), phone_no = phone_no, **extra_fields)
        user.set_password(password)
        user.save()

        return user


    def create_superuser(self, phone_no, password=None, **extra_fields):
        extra_fields.setdefault('is_staff', True)
        extra_fields.setdefault('is_superuser', True)
        extra_fields.setdefault('role_id', 1)

        return self.create_user(phone_no, password, **extra_fields)

    def get_queryset(self):
        return UserQuerySet(self.model, using=self._db).filter(deleted_at__isnull=True)

    def with_trashed(self):
        return UserQuerySet(self.model, using=self._db)