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


class AccountManager(BaseUserManager):
    """manage user creation methods"""

    use_in_migrations = True

    def _create_user(self, name, password, **extra_fields):
        """create regular user private"""
        values = [name, password]
        field_value_map = dict(zip(self.model.REQUIRED_FIELDS, values))
        for field_name, value in field_value_map.items():
            if not value:
                raise ValueError(f"The {field_name} value must be set")

        user = self.model(name=name, **extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user

    def create_user(self, name, password):
        """create regular user public"""
        return self._create_user(name, password)

    def create_superuser(self, name, password, **extra_fields):
        """create super user"""
        extra_fields.setdefault("is_staff", True)
        extra_fields.setdefault("is_superuser", True)

        if extra_fields.get("is_staff") is not True:
            raise ValueError("Superuser must have is_staff=True.")
        if extra_fields.get("is_superuser") is not True:
            raise ValueError("Superuser must have is_superuser=True.")

        return self._create_user(name, password, **extra_fields)


class Account(AbstractBaseUser, PermissionsMixin):
    """handle account creation"""

    name = models.CharField(max_length=150, unique=True)
    is_staff = models.BooleanField(default=False)
    objects = AccountManager()

    USERNAME_FIELD = "name"
    REQUIRED_FIELDS = ["password"]
