import uuid

from django.conf import settings
from django.db import models


class RoleChoices(models.TextChoices):
    """User's professional role for marketing purposes."""

    DEVREL = "devrel", "Developer Relations"
    COMMUNITY_MANAGER = "community_manager", "Community Manager"
    DEVELOPER = "developer", "Developer"
    OTHER = "other", "Other"


class CompanySizeChoices(models.TextChoices):
    """Company size categories for marketing purposes."""

    SOLO_INDIE = "solo_indie", "Solo/Indie"
    STARTUP = "startup", "Startup (2-50)"
    MIDSIZE = "midsize", "Mid-size (51-500)"
    ENTERPRISE = "enterprise", "Enterprise (500+)"


class CommunityChannelChoices(models.TextChoices):
    """Community channel platforms for marketing purposes."""

    GITHUB = "github", "GitHub"
    DISCORD = "discord", "Discord"
    SLACK = "slack", "Slack"
    TWITTER = "twitter", "Twitter/X"
    LINKEDIN = "linkedin", "LinkedIn"
    MASTODON = "mastodon", "Mastodon"
    DISCOURSE = "discourse", "Discourse"


class TimestampedModel(models.Model):
    """Abstract base for timestamped models."""

    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)

    class Meta:
        abstract = True


class Workspace(TimestampedModel):
    name = models.CharField(max_length=200)
    slug = models.SlugField(max_length=120, unique=True)

    def __str__(self) -> str:
        return self.slug


class WorkspaceMembership(TimestampedModel):
    ROLE_CHOICES = [
        ("owner", "Owner"),
        ("admin", "Admin"),
        ("member", "Member"),
        ("viewer", "Viewer"),
    ]

    user = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, related_name="workspace_memberships")
    workspace = models.ForeignKey(Workspace, on_delete=models.CASCADE, related_name="memberships")
    role = models.CharField(max_length=20, choices=ROLE_CHOICES, default="member")

    class Meta:
        unique_together = [("user", "workspace")]

    def __str__(self) -> str:
        return f"{self.user} in {self.workspace} as {self.role}"


class OnboardingProgress(TimestampedModel):
    """Tracks user's progress through the onboarding flow."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="onboarding_progress",
    )
    has_completed_onboarding = models.BooleanField(default=False)
    completed_welcome = models.BooleanField(default=False)
    completed_role = models.BooleanField(default=False)
    completed_company = models.BooleanField(default=False)
    completed_channels = models.BooleanField(default=False)

    class Meta:
        verbose_name_plural = "Onboarding progress"

    def __str__(self) -> str:
        status = "completed" if self.has_completed_onboarding else "in progress"
        return f"Onboarding for {self.user} ({status})"


class MarketingProfile(TimestampedModel):
    """Stores marketing data collected during onboarding."""

    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.OneToOneField(
        settings.AUTH_USER_MODEL,
        on_delete=models.CASCADE,
        related_name="marketing_profile",
    )
    role = models.CharField(
        max_length=20,
        choices=RoleChoices.choices,
        null=True,
        blank=True,
    )
    company_size = models.CharField(
        max_length=20,
        choices=CompanySizeChoices.choices,
        null=True,
        blank=True,
    )
    community_channels = models.JSONField(default=list, blank=True)

    def __str__(self) -> str:
        return f"Marketing profile for {self.user}"
