from math import floor
from extensions.utils import jalali_converter
from .sms import send_notification_to_winner, send_notification_to_customer
from dirtyfields import DirtyFieldsMixin
from user.models import User, Address
from core.models import Car, Product
from customer.models import Customer
from django.utils import timezone
from seller.models import Seller
from django.db import models
from core import models as coreModel
from user import models as userModel


class InquiryBox(models.Model):
    id = models.AutoField(primary_key=True)
    VIN = models.CharField(max_length=256, null=True, verbose_name="شماره شاسی")
    engine_volume = models.IntegerField(null=True, verbose_name="حجم موتور")
    production_year = models.IntegerField(null=True, verbose_name="سال تولید")
    type = models.CharField(max_length=256, null=True, verbose_name="تیپ")
    car = models.ForeignKey(Car, on_delete=models.CASCADE, null=True, verbose_name="خودرو")
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, null=True, verbose_name="مشتری")
    temp = models.BooleanField(default=True, blank=True, verbose_name="موقت")
    temp_created = models.DateTimeField(null=True, auto_now_add=True, verbose_name="زمان درج")
    created = models.DateTimeField(null=True, blank=True, verbose_name="زمان استعلام")

    class Meta:
        verbose_name = "سبد استعلام"
        verbose_name_plural = "سبدهای استعلام"

    def __str__(self):
        return str(self.id)

    def jalali_created(self):
        return jalali_converter(self.created) if self.created else ''

    def jalali_temp_created(self):
        return jalali_converter(self.temp_created) if self.temp_created else ''

    jalali_created.short_description = "زمان استعلام"
    jalali_temp_created.short_description = "زمان درج"


class Inquiry(models.Model):
    id = models.AutoField(primary_key=True)
    product = models.ForeignKey(Product, on_delete=models.CASCADE, null=True, verbose_name="قطعه")
    originality = models.CharField(max_length=200, blank=True, verbose_name="اصالت")
    count = models.IntegerField(default=1, verbose_name="تعداد / دست / لیتر")
    inquiry_box = models.ForeignKey(InquiryBox, related_name='inquiries', on_delete=models.CASCADE, null=True,
                                    verbose_name="سبد استعلام")

    class Meta:
        verbose_name = "استعلام"
        verbose_name_plural = "استعلام ها"

    def __str__(self):
        return f"{self.id} - {self.product.name}" if self.product and self.product.name else f"{self.id}"


class SuggestedPrices(DirtyFieldsMixin, models.Model):
    STATUS_CHOICES = (
        ('waiting', 'در انتظار ثبت قیمت'),
        ('priced', 'قیمت دهی شده'),
        ('rejected', 'انصراف'),
        ('from-base', 'بر اساس مبنا'),
        ('competition', 'رقابت با همکار'),
    )
    id = models.AutoField(primary_key=True)
    inquiry = models.ForeignKey(Inquiry, on_delete=models.CASCADE, null=True, verbose_name="سفارش")
    price = models.IntegerField(null=True, blank=True, verbose_name="فی")
    total_price = models.IntegerField(null=True, blank=True, verbose_name="قیمت کل")
    delivery_time = models.DateTimeField(null=True, blank=True, verbose_name="زمان تحویل")
    seller = models.ForeignKey(Seller, on_delete=models.CASCADE, null=True, verbose_name="فروشنده")
    created = models.DateTimeField(null=True, blank=True, verbose_name="زمان ثبت پیشنهاد")
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='waiting', blank=True,
                              verbose_name="وضعیت استعلام قیمت")
    accepted = models.BooleanField(default=False, blank=True, verbose_name="قبول شده")

    class Meta:
        verbose_name = "قیمت پیشنهادی"
        verbose_name_plural = "قیمت های پیشنهادی"

    def __str__(self):
        return str(self.id)

    def jalali_created(self):
        return jalali_converter(self.created) if self.created else ''

    def jalali_delivery_time(self):
        return jalali_converter(self.delivery_time) if self.delivery_time else ''

    jalali_created.short_description = "زمان ثبت پیشنهاد"
    jalali_delivery_time.short_description = "زمان تحویل"

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        if self.is_dirty():
            dirty_fields = self.get_dirty_fields()
            if 'accepted' in dirty_fields and not dirty_fields['accepted'] and self.accepted:
                send_notification_to_winner(self.seller.mobile, self.inquiry.inquiry_box.car.name,
                                            self.inquiry.product.name, self.price)
                send_notification_to_customer(self.inquiry.inquiry_box.customer.mobile)
                PriceBasis(suggested_id=self.id, expired=timezone.now() + timezone.timedelta(hours=24)).save()
        super(SuggestedPrices, self).save(force_insert, force_update)

    def get_final_price(self):
        return floor(self.price * (1 + (self.inquiry.product.get_product_benefit() / 100))) if self.price else 0

    def get_final_total_price(self):
        return floor(
            self.total_price * (1 + (self.inquiry.product.get_product_benefit() / 100))) if self.total_price else 0

    def get_discount(self):
        obj = coreModel.ProductDiscount.objects.filter(product=self.inquiry.product)
        return obj.first().discount if obj else 0


class PriceBasis(models.Model):
    id = models.AutoField(primary_key=True)
    suggested = models.ForeignKey(SuggestedPrices, on_delete=models.CASCADE, null=True, verbose_name="قیمت پیشنهادی")
    stock = models.IntegerField(null=True, blank=True, verbose_name="موجودی")
    created = models.DateTimeField(auto_now_add=True, verbose_name="زمان ثبت به عنوان مبنا")
    expired = models.DateTimeField(null=True, blank=True, verbose_name="زمان انقضا")

    class Meta:
        verbose_name = "مبنای 24 ساعته"
        verbose_name_plural = "مبنای 24 ساعته"

    def __str__(self):
        return str(self.id)

    def jalali_created(self):
        return jalali_converter(self.created)

    def jalali_expired(self):
        return jalali_converter(self.expired)

    def suggested_inquiry(self):
        return self.suggested.inquiry

    def suggested_total_price(self):
        return self.suggested.total_price

    def suggested_seller(self):
        return self.suggested.seller

    def is_active(self):
        return False if self.expired and self.expired < timezone.now() else True

    jalali_created.short_description = "زمان ثبت به عنوان مبنا"
    jalali_expired.short_description = "زمان انقضا"
    suggested_inquiry.short_description = "سفارش"
    suggested_total_price.short_description = "قیمت کل"
    suggested_seller.short_description = "فروشنده"
    is_active.short_description = "معتبر"
    is_active.boolean = True


class Orders(models.Model):
    STATUS_CHOICES = (
        ('cart', 'سبد خرید'),
        ('cancelled', 'کنسل شد'),
        ('payed', 'پرداخت شد'),
        ('preparing', 'در حال آماده سازی'),
        ('warehouse', 'تحویل به انبار'),
        ('quality', 'کنترل کیفی'),
        ('sent', 'ارسال شد'),
        ('delivered', 'تحویل داده شد')
    )
    id = models.AutoField(primary_key=True)
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='cart', blank=True, verbose_name="وضعیت سفارش")
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=True, verbose_name="خریدار")
    address = models.ForeignKey(Address, on_delete=models.CASCADE, null=True, verbose_name="آدرس")
    # delivery_time = models.DateTimeField(null=True, blank=True, verbose_name="زمان تحویل")
    post_price = models.IntegerField(null=True, verbose_name="هزینه ارسال")
    created = models.DateTimeField(auto_now_add=True, verbose_name="تاریخ سفارش")
    updated = models.DateTimeField(auto_now=True, verbose_name="زمان ویرایش")
    bank_record = models.IntegerField(blank=True, null=True, verbose_name="رکورد بانک")

    class Meta:
        verbose_name = "سفارش"
        verbose_name_plural = "سفارشات"

    def __str__(self):
        return str(self.id)

    def jalali_created(self):
        return jalali_converter(self.created)

    def jalali_updated(self):
        return jalali_converter(self.updated)

    jalali_created.short_description = "زمان ثبت سفارش"
    jalali_updated.short_description = "زمان ویرایش"


class OrderDetails(DirtyFieldsMixin, models.Model):
    id = models.AutoField(primary_key=True)
    order = models.ForeignKey(Orders, on_delete=models.CASCADE, related_name='order_details', null=True,
                              verbose_name="کد سفارش")
    inquiry = models.ForeignKey(Inquiry, on_delete=models.CASCADE, null=True, verbose_name="کد استعلام")
    price = models.IntegerField(null=True, verbose_name="قیمت")
    off = models.IntegerField(default=0, verbose_name="میزان تخفیف")
    suggested = models.ForeignKey(SuggestedPrices, on_delete=models.CASCADE, null=True, verbose_name="برنده مناقصه")
    cleared = models.BooleanField(default=False, blank=True, verbose_name='تسویه شده')

    class Meta:
        verbose_name = "قطعه"
        verbose_name_plural = "جزئیات سفارش"

    def __str__(self):
        return str(self.id)

    def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
        if self.is_dirty():
            dirty_fields = self.get_dirty_fields()
            if 'cleared' in dirty_fields and self.cleared:
                self.suggested.seller.wallet = self.suggested.seller.wallet - self.price
                self.suggested.seller.save()
        super(OrderDetails, self).save(force_insert, force_update)

    def product_name(self):
        return self.inquiry.product.name

    def product_count(self):
        return self.inquiry.count

    def product_originality(self):
        return self.inquiry.originality

    def seller_shop(self):
        return self.suggested.seller

    def seller_mobile(self):
        return self.suggested.seller.mobile

    def seller_phone(self):
        return self.suggested.seller.phone

    def delivery_time(self):
        return self.suggested.delivery_time

    def jalali_delivery_time(self):
        return self.suggested.jalali_delivery_time()

    def seller_address(self):
        return userModel.Address.objects.filter(user=self.suggested.seller).first()

    product_name.short_description = 'نام قطعه'
    product_count.short_description = 'تعداد'
    product_originality.short_description = 'اصالت'
    seller_shop.short_description = 'فروشنده'
    seller_mobile.short_description = 'شماره همراه فروشنده'
    seller_phone.short_description = 'شماره ثابت فروشنده'
    delivery_time.short_description = 'زمان تحویل'
    jalali_delivery_time.short_description = 'زمان تحویل'
    seller_address.short_description = 'آدرس فروشگاه'
