"""Factories for accounts app models."""

import factory
from django.contrib.auth import get_user_model
from factory.django import DjangoModelFactory

from accounts.models import Workspace, WorkspaceMembership

User = get_user_model()


class UserFactory(DjangoModelFactory):
    """Factory for creating User instances."""

    class Meta:
        model = User

    username = factory.Sequence(lambda n: f"user{n}")
    email = factory.LazyAttribute(lambda obj: f"{obj.username}@example.com")
    password = factory.PostGenerationMethodCall("set_password", "testpass123")
    is_active = True

    @classmethod
    def _create(cls, model_class, *args, **kwargs):
        """Override create to handle password properly."""
        password = kwargs.pop("password", None)
        obj = super()._create(model_class, *args, **kwargs)
        if password:
            obj.set_password(password)
            obj.save()
        return obj


class WorkspaceFactory(DjangoModelFactory):
    """Factory for creating Workspace instances."""

    class Meta:
        model = Workspace

    name = factory.Sequence(lambda n: f"Workspace {n}")
    slug = factory.Sequence(lambda n: f"workspace-{n}")


class WorkspaceMembershipFactory(DjangoModelFactory):
    """Factory for creating WorkspaceMembership instances."""

    class Meta:
        model = WorkspaceMembership

    user = factory.SubFactory(UserFactory)
    workspace = factory.SubFactory(WorkspaceFactory)
    role = "member"
