import uuid
from bs4 import BeautifulSoup
from django.db import models
from django.utils.translation import gettext_lazy as _
from django.contrib.auth import get_user_model
from geo_location.models import City, Country, Location
from main.fields import WEBPField
from main.models import Language
from django.utils.text import slugify
# Create your models here.

User = get_user_model()

CHECK_BOOLEAN = [
    (True,_("submitted")),
    (False,_("ignored")),
]

ACTIVE_BOOLEAN = [
    (True,_("active")),
    (False,_("deactive")),
]

QUESTION_BOOLEAN = [
    (True,_("yes")),
    (False,_("no")),
]


def image_developer_folder(instance, filename):
    return f'developer/{instance.slug}.webp'

class Developer(models.Model):
    name = models.CharField(_("Name"), max_length=150, db_index=True, null=True, blank=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, unique=True, null=True, blank=True)
    summary = models.CharField(_("Summary"), max_length=250, null=True, blank=True)
    is_featured = models.BooleanField(_("Featured"), default=False, choices=QUESTION_BOOLEAN)
    is_active = models.BooleanField(_("active"), default=True, choices=QUESTION_BOOLEAN)
    is_deleted = models.BooleanField(_("Deleted"), default=False, choices=QUESTION_BOOLEAN)
    web_address = models.URLField(_("web address"), max_length=250, null=True, blank=True)
    
    image = WEBPField(_("Image"), upload_to=image_developer_folder, db_index=True, default="blank/3590078.webp")
    rate = models.IntegerField(_("Rate"), default=10)
    target_location = models.CharField(_("Target location"), max_length=250, null=True, blank=True)
    location = models.ForeignKey(Location, on_delete=models.CASCADE, verbose_name="location", related_name="developers", null=True, blank=True)
    country = models.ForeignKey(Country, on_delete=models.CASCADE, verbose_name=_("country"), related_name="developers", null=True, blank=True)
    city = models.ForeignKey(City, on_delete=models.CASCADE, verbose_name=_("city"), related_name="developers", null=True, blank=True)
    
    translated = models.BooleanField(_("translated"), default=False, choices=QUESTION_BOOLEAN)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)

    def __str__(self):
        return f"{self.name}"

    class Meta:
        verbose_name = _("Developer")
        verbose_name_plural = _("Developers")
        ordering = ["name", "-web_address", "slug", "-id"]
        
    def save(self, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        if self.country is None and self.location is not None:
            self.country = self.location.country
        if self.city is None and self.location is not None:
            self.city = self.location.city
        return super().save()
    
    @property
    def property_num(self):
        return self.developments.all().count()
        
class DeveloperTranslate(models.Model):
    developer = models.ForeignKey(Developer, on_delete=models.CASCADE, related_name="translates")
    language = models.ForeignKey(Language, on_delete=models.CASCADE, related_name="developer_translates")
    name = models.CharField(_("Name"), max_length=150, db_index=True, null=True, blank=True)
    slug = models.SlugField(_("Slug"), max_length=250, db_index=True, allow_unicode=True, null=True, blank=True)
    summary = models.CharField(_("Summary"), max_length=250, null=True, blank=True)
    description = models.TextField(_("Description"), null=True, blank=True)
    is_paraphrased = models.BooleanField(_("Paraphrased"), default=False, choices=QUESTION_BOOLEAN)
    paraphrase_error = models.BooleanField(_("Paraphrase error"), default=False, choices=QUESTION_BOOLEAN)
    error = models.TextField(_("Error"), null=True, blank=True)
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"
    
    def save(self, **kwargs):
        if self.name: self.slug = slugify(self.name, allow_unicode=True)
        if self.summary is None or self.summary == "":
            try: self.summary = BeautifulSoup(self.description, 'html.parser').get_text()[:200]
            except: pass
        return super().save(**kwargs)
    
    class Meta:
        verbose_name = _("Developer Translate")
        verbose_name_plural = _("Developer Translates")
        ordering = ["developer", "-id"]
        constraints = [
            models.UniqueConstraint(fields=['language', 'developer'], name='repeated_language_developer_translate'),
        ]
        
def image_person_folder(instance, filename):
    return f'contact-person/{instance.id}/{uuid.uuid4().hex}.webp'

class ContactPerson(models.Model):
    developer = models.ForeignKey(Developer, on_delete=models.CASCADE, verbose_name=_("developer"), related_name="contact_person")
    name = models.CharField(_("Name"), max_length=150)
    phone = models.CharField(_("Phone"), max_length=150)
    email = models.EmailField(_("Email"), max_length=150)
    mobile = models.CharField(_("Mobile"), max_length=150)
    whatsapp = models.CharField(_("Whatsapp"), max_length=150)
    image = WEBPField(_("Image"), upload_to=image_person_folder, blank=True, null=True)

    is_active = models.BooleanField(_("Checked"), default=True, choices=CHECK_BOOLEAN)
    is_deleted = models.BooleanField(_("Deleted"), default=False, choices=QUESTION_BOOLEAN)

    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.name}"

    class Meta:
        verbose_name = _("Contact Person")
        verbose_name_plural = _("Contact Persons")
        ordering = ["-id"]        

class DeveloperReview(models.Model):
    developer = models.ForeignKey(Developer, on_delete=models.CASCADE, verbose_name=_("developer"), related_name="developer_reviews")
    user = models.ForeignKey(User, on_delete=models.SET_NULL, verbose_name=_("user"), related_name="developer_reviews", null=True, blank=True)

    review = models.TextField(_("Review"), null=True, blank=True)
    rate = models.IntegerField(_("Rate"), default=10)
    
    created_at = models.DateTimeField(_("created at"), auto_now_add=True)
    updated_at = models.DateTimeField(_("updated at"), auto_now=True)
    
    def __str__(self):
        return f"{self.developer.name}"
    
    class Meta:
        verbose_name = _("Developer Review")
        verbose_name_plural = _("Developer Reviews")
        ordering = ["-id"]

