from django.contrib.auth.models import AbstractUser
from django.db import models


class User(AbstractUser):
    """Platform user - job seeker, employer, or administrator."""

    class Role(models.TextChoices):
        SEEKER = 'seeker', 'Job Seeker'
        COMPANY = 'company', 'Employer'
        ADMIN = 'admin', 'Administrator'

    role = models.CharField(
        max_length=20,
        choices=Role.choices,
        default=Role.SEEKER,
    )
    phone = models.CharField(max_length=30, blank=True)
    avatar = models.ImageField(upload_to='avatars/', max_length=255, blank=True, null=True)
    cover_image = models.ImageField(upload_to='accounts/covers/', max_length=255, blank=True, null=True)

    class Meta:
        verbose_name = 'user'
        verbose_name_plural = 'users'

    def __str__(self):
        return self.get_full_name() or self.username

    @property
    def is_seeker(self):
        return self.role == self.Role.SEEKER

    @property
    def is_company(self):
        return self.role == self.Role.COMPANY

    @property
    def is_platform_admin(self):
        return self.role == self.Role.ADMIN or self.is_superuser

    @property
    def has_active_seeker_subscription(self):
        from subscriptions.access import user_has_seeker_subscription
        return user_has_seeker_subscription(self)

    @property
    def has_active_company_subscription(self):
        from subscriptions.access import user_has_company_subscription
        return user_has_company_subscription(self)


class UserNotification(models.Model):
    """In-app notification imported from legacy profile_store_notification."""
    recipient = models.ForeignKey(
        'accounts.User',
        on_delete=models.CASCADE,
        related_name='notifications',
    )
    sender = models.ForeignKey(
        'accounts.User',
        on_delete=models.SET_NULL,
        null=True,
        blank=True,
        related_name='notifications_sent',
    )
    title = models.CharField(max_length=200, blank=True)
    subject = models.CharField(max_length=200, blank=True)
    body = models.TextField(blank=True)
    message = models.TextField(blank=True)
    notification_type = models.CharField(max_length=50, blank=True)
    redirect_url = models.URLField(blank=True)
    button_text = models.CharField(max_length=80, blank=True)
    image = models.CharField(max_length=255, blank=True)
    is_read = models.BooleanField(default=False)
    created_at = models.DateTimeField(auto_now_add=True)

    class Meta:
        ordering = ['-created_at']

    def __str__(self):
        return self.title or self.subject or f'Notification #{self.pk}'

    @property
    def display_body(self):
        return self.body or self.message

    @property
    def link_path(self):
        from django.conf import settings

        if not self.redirect_url:
            return ''
        site = settings.SITE_URL.rstrip('/')
        if self.redirect_url.startswith(site):
            return self.redirect_url[len(site):] or '/'
        return self.redirect_url


    def save(self, *args, **kwargs):
        from home.textclean import strip_emoji

        for name in ('title', 'subject', 'body', 'message', 'button_text'):
            setattr(self, name, strip_emoji(getattr(self, name, '')))
        super().save(*args, **kwargs)
