from django.contrib.auth import get_user_model

from misago.core.testutils import MisagoTestCase

from .models import AnonymousUser, Online


UserModel = get_user_model()


class UserTestCase(MisagoTestCase):
    USER_PASSWORD = "Pass.123"
    USER_IP = '127.0.0.1'

    def setUp(self):
        super(UserTestCase, self).setUp()
        self.get_initial_user()

    def get_initial_user(self):
        self.user = self.get_anonymous_user()

    def get_anonymous_user(self):
        return AnonymousUser()

    def get_authenticated_user(self):
        return UserModel.objects.create_user(
            "TestUser",
            "test@user.com",
            self.USER_PASSWORD,
            joined_from_ip=self.USER_IP,
        )

    def get_superuser(self):
        user = UserModel.objects.create_superuser(
            "TestSuperUser", "test@superuser.com", self.USER_PASSWORD
        )
        user.joined_from_ip = self.USER_IP
        user.save()
        return user

    def login_user(self, user, password=None):
        self.client.force_login(user)

    def logout_user(self):
        if self.user.is_authenticated:
            Online.objects.filter(user=self.user).delete()
        self.client.logout()


class AuthenticatedUserTestCase(UserTestCase):
    def get_initial_user(self):
        self.user = self.get_authenticated_user()
        self.login_user(self.user)

    def reload_user(self):
        self.user = UserModel.objects.get(id=self.user.id)


class SuperUserTestCase(AuthenticatedUserTestCase):
    def get_initial_user(self):
        self.user = self.get_superuser()
        self.login_user(self.user)
