from django.contrib.auth import get_user_model

User = get_user_model()


def _create_user(username, is_cof=False, is_staff=False, attrs=None):
    if attrs is None:
        attrs = {}

    password = attrs.pop("password", username)

    user_keys = ["first_name", "last_name", "email", "is_staff", "is_superuser"]
    user_attrs = {k: v for k, v in attrs.items() if k in user_keys}

    profile_keys = [
        "is_cof",
        "login_clipper",
        "phone",
        "occupation",
        "departement",
        "type_cotiz",
        "mailing_cof",
        "mailing_bda",
        "mailing_bda_revente",
        "comments",
        "is_buro",
        "petit_cours_accept",
        "petit_cours_remarques",
    ]
    profile_attrs = {k: v for k, v in attrs.items() if k in profile_keys}

    if is_cof:
        profile_attrs["is_cof"] = True

    if is_staff:
        # At the moment, admin is accessible by COF staff.
        user_attrs["is_staff"] = True
        profile_attrs["is_buro"] = True

    user = User(username=username, **user_attrs)
    user.set_password(password)
    user.save()

    for k, v in profile_attrs.items():
        setattr(user.profile, k, v)
    user.profile.save()

    return user


def create_user(username, attrs=None):
    return _create_user(username, attrs=attrs)


def create_member(username, attrs=None):
    return _create_user(username, is_cof=True, attrs=attrs)


def create_staff(username, attrs=None):
    return _create_user(username, is_cof=True, is_staff=True, attrs=attrs)


def create_root(username, attrs=None):
    if attrs is None:
        attrs = {}
    attrs.setdefault("is_staff", True)
    attrs.setdefault("is_superuser", True)
    return _create_user(username, attrs=attrs)