from django.test import Client, TestCase
from passlib.context import CryptContext

from integrations.models import Client as WorkspaceClient, ClientUserMembership

from .models import User

pwd_ctx = CryptContext(schemes=["bcrypt"], deprecated="auto")


class AuthParityTests(TestCase):
    def setUp(self):
        self.client = Client()
        user = User.objects.create(username="test@example.com", password=pwd_ctx.hash("secret123"), role="user")
        workspace = WorkspaceClient.objects.create(
            name="Nixon", slug="nixon", subdomain="nixon", is_active=True
        )
        ClientUserMembership.objects.create(client=workspace, user=user, is_active=True)

    def test_login_me_logout_flow(self):
        response = self.client.post(
            "/api/auth/login",
            data={"username": "test@example.com", "password": "secret123", "remember_me": False},
            content_type="application/json",
            HTTP_X_WORKSPACE_SUBDOMAIN="nixon",
        )
        self.assertEqual(response.status_code, 200)
        self.assertIn("session_token", response.cookies)

        response = self.client.get("/api/auth/me", HTTP_X_WORKSPACE_SUBDOMAIN="nixon")
        self.assertEqual(response.status_code, 200)
        self.assertEqual(response.json()["user"]["username"], "test@example.com")

        response = self.client.post("/api/auth/logout")
        self.assertEqual(response.status_code, 200)

        response = self.client.get("/api/auth/me")
        self.assertEqual(response.status_code, 401)

    def test_invite_and_reset_endpoints_exist(self):
        response = self.client.get("/api/auth/invite", {"token": "missing"})
        self.assertEqual(response.status_code, 200)
        self.assertFalse(response.json()["valid"])

        response = self.client.post(
            "/api/auth/request-password-reset",
            data={"email": "test@example.com"},
            content_type="application/json",
        )
        self.assertEqual(response.status_code, 200)
