from django.db import models
from django.utils.html import format_html
from ckeditor_uploader.fields import RichTextUploadingField
from setting import models as settingModel


def logo(instance, filename):
    return "logo/{}".format(filename)


def brand(instance, filename):
    return "brand/{}".format(filename)


def category(instance, filename):
    return "category/{}".format(filename)


def car(instance, filename):
    return "car/{}".format(filename)


def car_show(instance, filename):
    return "car/show/{}".format(filename)


def car_gallery(instance, filename):
    return "car/gallery/{}".format(filename)


def product(instance, filename):
    return "product/{}".format(filename)


class IPAddress(models.Model):
    ip_address = models.GenericIPAddressField(verbose_name="آدرس ip")


class Brand(models.Model):
    STATUS_CHOICES = (
        ('waiting', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
    )
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام برند")
    english_name = models.CharField(max_length=256, null=True, verbose_name="نام انگلیسی برند")
    icon = models.ImageField(upload_to=brand, null=True, blank=True, verbose_name="آیکن برند")
    VINRequired = models.BooleanField(default=True, blank=True, verbose_name='اجباری بودن شماره شاسی')
    short_description = models.TextField(null=True, blank=True, verbose_name="متن کوتاه")
    description = RichTextUploadingField(null=True, blank=True, verbose_name="توضیحات")
    meta_title = models.CharField(max_length=65, null=True, blank=True, verbose_name='عنوان سئو صفحه برند (title)')
    meta_description = models.CharField(max_length=160, null=True, blank=True, verbose_name='توضیحات سئو صفحه برند (description)')
    admin_order = models.PositiveIntegerField(default=0, blank=False, null=False, verbose_name="اولویت نمایش")
    status = models.CharField(max_length=20, default='approved', choices=STATUS_CHOICES, verbose_name="وضعیت نمایش")

    class Meta:
        ordering = ('admin_order',)
        verbose_name = "برند"
        verbose_name_plural = "برندها"

    def __str__(self):
        return self.name

    def icon_tag(self):
        if self.icon:
            return format_html("<img width=70 height=60 style='border-radius:5px;' src='{}'>".format(self.icon.url))
        return "ندارد"

    icon_tag.short_description = "آیکن برند"


class BrandOriginality(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام")
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, null=True, verbose_name="برند")

    class Meta:
        verbose_name = "اصالت"
        verbose_name_plural = "اصالت"

    def __str__(self):
        return self.name


class Category(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام دسته بندی")
    icon = models.ImageField(upload_to=category, null=True, blank=True, verbose_name="آیکن دسته بندی")
    admin_order = models.PositiveIntegerField(default=0, blank=False, null=False, verbose_name="اولویت نمایش")

    class Meta:
        ordering = ('admin_order',)
        verbose_name = "دسته بندی"
        verbose_name_plural = "دسته بندی ها"

    def __str__(self):
        return self.name

    def icon_tag(self):
        if self.icon:
            return format_html("<img width=70 height=60 style='border-radius:5px;' src='{}'>".format(self.icon.url))
        return "ندارد"

    icon_tag.short_description = "آیکن دسته بندی"


class Subcategory(models.Model):
    STATUS_CHOICES = (
        ('waiting', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
    )
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام دسته")
    icon = models.ImageField(upload_to=category, null=True, blank=True, verbose_name="آیکن دسته")
    image = models.ImageField(upload_to=product, null=True, blank=True, verbose_name="تصویر دسته")
    category = models.ForeignKey(Category, on_delete=models.CASCADE, null=True, verbose_name="دسته اصلی")
    parent = models.ForeignKey("Subcategory", related_name="subcategories", null=True, blank=True,
                               on_delete=models.CASCADE, verbose_name='دسته والد')
    description = RichTextUploadingField(null=True, blank=True, verbose_name="توضیحات")
    admin_order = models.PositiveIntegerField(default=0, blank=False, null=False)
    status = models.CharField(max_length=20, default='approved', choices=STATUS_CHOICES, verbose_name="وضعیت نمایش")

    class Meta:
        ordering = ('admin_order',)
        verbose_name = "زیردسته"
        verbose_name_plural = "زیردسته ها"

    def __str__(self):
        return self.name

    def icon_tag(self):
        if self.icon:
            return format_html("<img width=70 height=60 style='border-radius:5px;' src='{}'>".format(self.icon.url))
        return "ندارد"

    icon_tag.short_description = "تصویر زیر دسته"


class Product(models.Model):
    COUNT_CHOICES = (
        ('number', 'عدد'),
        ('set', 'دست'),
        ('liter', 'لیتر'),
    )
    STATUS_CHOICES = (
        ('waiting', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
    )
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام قطعه")
    subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE, null=True, verbose_name="دسته")
    aparat_link = models.CharField(max_length=256, null=True, blank=True, verbose_name="لینک ویدیو")
    code = models.CharField(max_length=15, null=True, blank=True, verbose_name="کد قطعه در تصویر")
    position = models.CharField(max_length=40, null=True, blank=True, verbose_name='مختصات')
    count_type = models.CharField(max_length=20, default='number', choices=COUNT_CHOICES, verbose_name="نوع شمارش")
    group = models.CharField(max_length=50, null=True, blank=True, verbose_name="گروه")
    status = models.CharField(max_length=20, default='approved', choices=STATUS_CHOICES, verbose_name="وضعیت نمایش")

    class Meta:
        verbose_name = "قطعه"
        verbose_name_plural = "قطعات"

    def __str__(self):
        return self.name

    def get_product_benefit(self):
        obj = ProductBenefit.objects.filter(product_id=self.pk)
        return obj.first().benefit if obj else settingModel.SiteSetting.get_solo().default_benefit


class ProductSynonym(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, related_name="product_synonyms", verbose_name="قطعه")
    name = models.CharField(max_length=256, verbose_name="لغت مشابه")

    class Meta:
        verbose_name = "مترادف"
        verbose_name_plural = "مشابهات"

    def __str__(self):
        return self.name


class Car(models.Model):
    STATUS_CHOICES = (
        ('waiting', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
    )
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, verbose_name="نام خودرو")
    english_name = models.CharField(max_length=256, null=True, verbose_name="نام انگلیسی خودرو")
    image = models.ImageField(upload_to=car, null=True, blank=True, verbose_name="تصویر خودرو")
    show_image = models.ImageField(upload_to=car_show, null=True, blank=True, verbose_name="تصویر خودرو در صفحه نمایش")
    brand = models.ForeignKey(Brand, on_delete=models.CASCADE, null=True, verbose_name="برند")
    subcategories = models.ManyToManyField(Subcategory, blank=True, through='CarSubcategory', verbose_name="زیردسته ها")
    products = models.ManyToManyField(Product, blank=True, through='CarProduct', verbose_name="قطعات")
    description = RichTextUploadingField(null=True, blank=True, verbose_name="توضیحات")
    introduction = RichTextUploadingField(null=True, blank=True, verbose_name="معرفی خودرو")
    technical_info = RichTextUploadingField(null=True, blank=True, verbose_name="اطلاعات فنی")
    car_test = RichTextUploadingField(null=True, blank=True, verbose_name="تست خودرو")
    meta_title = models.CharField(max_length=65, null=True, blank=True, verbose_name='عنوان سئو صفحه خودرو (title)')
    meta_description = models.CharField(max_length=160, null=True, blank=True, verbose_name='توضیحات سئو صفحه خودرو (description)')
    admin_order = models.PositiveIntegerField(default=0, blank=False, null=False, verbose_name="اولویت نمایش")
    status = models.CharField(max_length=20, default='approved', choices=STATUS_CHOICES, verbose_name="وضعیت نمایش")

    class Meta:
        ordering = ('admin_order',)
        verbose_name = "خودرو"
        verbose_name_plural = "خودرو ها"

    def __str__(self):
        return self.name

    def image_tag(self):
        if self.image:
            return format_html("<img width=70 height=45 style='border-radius:5px;' src='{}'>".format(self.image.url))
        return "ندارد"

    image_tag.short_description = "تصویر خودرو"


class CarSynonym(models.Model):
    id = models.AutoField(primary_key=True)
    car = models.ForeignKey(Car, on_delete=models.CASCADE, related_name="car_synonyms", verbose_name="خودرو")
    name = models.CharField(max_length=256, verbose_name="لغت مشابه")

    class Meta:
        verbose_name = "مترادف"
        verbose_name_plural = "مشابهات"

    def __str__(self):
        return self.name


class CarSubcategory(models.Model):
    id = models.AutoField(primary_key=True)
    icon = models.ImageField(upload_to=category, null=True, blank=True, verbose_name="آیکن دسته")
    image = models.ImageField(upload_to=product, null=True, blank=True, verbose_name="تصویر دسته")
    alt = models.CharField(max_length=256, null=True, blank=True, verbose_name='توضیحات تصویر (alt)')
    meta_title = models.CharField(max_length=65, null=True, blank=True, verbose_name='عنوان سئو صفحه قطعات (title)')
    meta_description = models.CharField(max_length=160, null=True, blank=True, verbose_name='توضیحات سئو صفحه قطعات (description)')
    car = models.ForeignKey(Car, on_delete=models.CASCADE, verbose_name="خودرو")
    subcategory = models.ForeignKey(Subcategory, on_delete=models.CASCADE, verbose_name="زیردسته")
    description = RichTextUploadingField(null=True, blank=True, verbose_name="توضیحات")

    class Meta:
        verbose_name = "زیردسته مخصوص"
        verbose_name_plural = "زیردسته های مخصوص"

    def __str__(self):
        return f'{self.subcategory.name} {self.car.name}'


class CarProduct(models.Model):
    id = models.AutoField(primary_key=True)
    code = models.CharField(max_length=15, null=True, blank=True, verbose_name="کد قطعه در تصویر")
    position = models.CharField(max_length=40, null=True, blank=True, verbose_name='مختصات')
    car = models.ForeignKey(Car, on_delete=models.CASCADE, verbose_name="خودرو")
    product = models.ForeignKey(Product, on_delete=models.CASCADE, verbose_name="قطعه")

    class Meta:
        verbose_name = "قطعه"
        verbose_name_plural = "قطعات مخصوص"

    def __str__(self):
        return f'{self.product.name} {self.car.name}'


class CarGallery(models.Model):
    id = models.AutoField(primary_key=True)
    image = models.ImageField(upload_to=car_gallery, null=True, blank=True, verbose_name="تصویر")
    title = models.CharField(max_length=256, null=True, blank=True, verbose_name="عنوان")
    car = models.ForeignKey(Car, on_delete=models.CASCADE)

    class Meta:
        verbose_name = "تصویر"
        verbose_name_plural = "تصاویر گالری"

    def __str__(self):
        return self.title or ""


class Type(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=256, null=True, blank=True, verbose_name="نام تیپ")
    volume = models.IntegerField(null=True, blank=True, verbose_name="حجم موتور")
    start_year = models.IntegerField(null=True, blank=True, verbose_name="شروع سال تولید")
    end_year = models.IntegerField(null=True, blank=True, verbose_name="پایان سال تولید")
    car = models.ForeignKey(Car, on_delete=models.CASCADE, null=True, verbose_name='نام خودرو')

    class Meta:
        verbose_name = "تیپ"
        verbose_name_plural = "تیپ ها"

    def __str__(self):
        if self.name:
            return self.name
        elif self.volume:
            return str(self.volume) + 'cc'
        else:
            return str(self.start_year) + ' تا ' + str(self.end_year)


class ProductBenefit(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, verbose_name="قطعه")
    benefit = models.IntegerField(null=True, blank=True, verbose_name="میزان سود (درصد)")

    class Meta:
        verbose_name = "سود قطعه"
        verbose_name_plural = "سود قطعات"

    def __str__(self):
        return str(self.id)


class ProductDiscount(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, verbose_name="قطعه")
    discount = models.IntegerField(null=True, blank=True, verbose_name="میزان تخفیف (درصد)")

    class Meta:
        verbose_name = "تخفیف قطعه"
        verbose_name_plural = "تخفیف قطعات"

    def __str__(self):
        return str(self.id)
