"""Factories for messages app models."""

import factory
from django.utils import timezone
from factory.django import DjangoModelFactory

from accounts.tests.factories import WorkspaceFactory
from members.tests.factories import MemberFactory
from messages.models import Message, Signal, Tag, Thread
from sources.tests.factories import SourceFactory


class TagFactory(DjangoModelFactory):
    """Factory for creating Tag instances."""

    class Meta:
        model = Tag

    workspace = factory.SubFactory(WorkspaceFactory)
    name = factory.Sequence(lambda n: f"tag-{n}")


class ThreadFactory(DjangoModelFactory):
    """Factory for creating Thread instances."""

    class Meta:
        model = Thread

    workspace = factory.SubFactory(WorkspaceFactory)
    source = factory.SubFactory(SourceFactory, workspace=factory.SelfAttribute("..workspace"))
    external_id = factory.Sequence(lambda n: f"thread-{n}")
    title = factory.Sequence(lambda n: f"Thread {n}")
    status = "open"
    metadata = factory.LazyFunction(dict)
    activity_at = factory.LazyFunction(timezone.now)


class SignalFactory(DjangoModelFactory):
    """Factory for creating Signal instances."""

    class Meta:
        model = Signal

    workspace = factory.SubFactory(WorkspaceFactory)
    source = factory.SubFactory(SourceFactory, workspace=factory.SelfAttribute("..workspace"))
    signal_type = "mention"
    occurred_at = factory.LazyFunction(timezone.now)
    title = factory.Sequence(lambda n: f"Signal {n}")
    external_url = factory.Sequence(lambda n: f"https://example.com/signal/{n}")
    external_id = factory.Sequence(lambda n: f"signal-{n}")
    body = ""
    actor = factory.SubFactory(MemberFactory, workspace=factory.SelfAttribute("..workspace"))
    metadata = factory.LazyFunction(dict)


class MessageFactory(DjangoModelFactory):
    """Factory for creating Message instances."""

    class Meta:
        model = Message

    thread = factory.SubFactory(ThreadFactory)
    author = factory.SubFactory(MemberFactory, workspace=factory.SelfAttribute("..thread.workspace"))
    external_id = factory.Sequence(lambda n: f"msg-{n}")
    content = factory.Sequence(lambda n: f"Message content {n}")
    sent_at = factory.LazyFunction(timezone.now)
    metadata = factory.LazyFunction(dict)
