from django.db import models
import uuid
from products.models import SKU, Products,ProductSubCategory, ProductCategory, CustomProduct
from accounts.models import Users
from shops.models import Shop, ProductionUnit



class DeliveryBoys(models.Model):
    team_member_name = models.CharField(max_length=20, blank=True, null=True)
    phone_number = models.CharField(max_length=14, blank=True, null=True)
    shop = models.ForeignKey(Shop, on_delete=models.CASCADE, blank=True, null=True)
    delivery_boy_status = models.CharField(
        max_length=100,
        choices=[("assigned", "assigned"), ("not assigned", "not assigned")],
        default="not assigned",
    )
    status = models.CharField(
        max_length=100,
        choices=[("not verified", "not verified"), ("verified", "verified")],
        default="not verified",
    )
    created_date = models.DateTimeField(auto_now_add=True, null=True)
    updated_date = models.DateTimeField(auto_now=True, null=True)

    def __str__(self):
        return f"Delivery Boy {self.team_member_name}"


class Dropaddress(models.Model):
    uuid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, unique=True, editable=False
    )
    name = models.CharField(max_length=200)
    house_number_or_name = models.CharField(max_length=200)
    street = models.CharField(max_length=100)
    land_mark = models.CharField(max_length=250, blank=True, null=True)
    city = models.CharField(max_length=100)
    district = models.CharField(max_length=50, blank=True, null=True)
    state_or_province = models.CharField(max_length=100)
    pin_code = models.IntegerField()
    latitude = models.FloatField()
    longitude = models.FloatField()
    address_type = models.CharField(
        max_length=100,
        choices=[("home", "home"), ("work", "work"), ("others", "others")],
    )
    contact_number = models.CharField(max_length=20)



class Orders(models.Model):
    uuid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, unique=True, editable=False
    )
    order_ID = models.CharField(max_length=255, blank=True, null=True)
    order_type = models.CharField(
        max_length=50,
        choices=[
            ("Local Orders", "Local Orders"),
            ("Long Distance Orders", "Long Distance Orders"),
            ("Custom Orders", "Custom Orders"),
            ("Pick Up", "Pick Up"),
        ],
    )
    sub_total = models.FloatField(blank=True, null=True)
    taxes_and_charges = models.FloatField(blank=True, null=True)
    delivery_charges = models.FloatField(blank=True, null=True)
    grand_total = models.FloatField(blank=True, null=True)
    order_status = models.CharField(
        max_length=50,
        choices=[
            ("New Order", "New Order"),
            ("Enquiry", "Enquiry"),
            ("Confirmed", "Confirmed"),
            ("Viewed", "Viewed"),
            ("Order Packed", "Order Packed"),
            ("Delivery Assigned", "Delivery Assigned"),
            ("Despatched", "Despatched"),
            ("Contacted", "Contacted"),
            ("Bill Created", "Bill Created"),
            ("Delivered", "Delivered"),
            ("Failed", "Failed"),
        ],
    )
    user_uuid = models.ForeignKey(
        Users, on_delete=models.CASCADE, limit_choices_to={"user_type": "Customer"}
    )
    store_uuid = models.ForeignKey(
        Shop, blank=True, null=True, on_delete=models.SET_NULL
    )
    pu_uuid = models.ForeignKey(
        ProductionUnit, on_delete=models.SET_NULL, blank=True, null=True
    )
    custom_product = models.ForeignKey(CustomProduct, on_delete=models.CASCADE, blank = True, null= True)
    drop_address = models.OneToOneField(
        Dropaddress, on_delete=models.SET_NULL, blank=True, null=True
    )
    delivery_boy = models.CharField(max_length=255, blank=True, null=True)
    delivery_instruction = models.TextField(blank=True, null=True)
    cooking_instruction = models.TextField(blank=True, null=True)
    order_assigntime = models.DateTimeField(blank=True, null=True)
    order_delivered_time = models.DateTimeField(blank=True, null=True)
    delivery_slot_date = models.DateField(blank=True, null=True)
    delivery_slot_time = models.TimeField(blank=True, null=True)
    color_status = models.CharField(
        max_length=50,
        null=True,
        choices=[
            ("White", "White"),
            ("Yellow", "Yellow"),
            ("Orange", "Orange"),
            ("Red", "Red"),
            ("Dark Red", "Dark  Red"),
        ],
    )
    color_status_updation_time = models.DateTimeField(auto_now_add=True)
    created_date = models.DateTimeField(auto_now_add=True)
    updated_date = models.DateTimeField(auto_now=True)
    total_savings = models.FloatField(blank=True, null=True)  
    coupon_savings = models.FloatField(blank=True, null=True)  
    discount = models.FloatField(blank=True, null=True)
    description = models.TextField(blank=True, null=True)
    message = models.CharField(blank=True, null=True)

    def __str__(self):
        return (
            "OrderID:"
            + str(self.order_ID)
            + "       Order_type    "
            + str(self.order_type)
        )


class OrderProducts(models.Model):
    order_product_id = models.UUIDField(
        primary_key=True, default=uuid.uuid4, unique=True, editable=False
    )
    product_name = models.CharField(max_length=255, blank=True, null=True)
    sku = models.ForeignKey(
        SKU, related_name="sku", null=True, on_delete=models.SET_NULL
    )
    quantity = models.CharField(max_length=255, blank=True, null=True)
    price = models.FloatField(blank=True, null=True)
    order = models.ForeignKey(
        Orders, related_name="order_data", on_delete=models.PROTECT
    )




class OrderDelivery(models.Model):
    delivery_type = models.CharField(
        max_length=50,
        choices=[
            ("Own Delivery", "Own Delivery"),
            ("Courier Delivery", "Courier Delivery"),
            ("Pick Up", "Pick Up"),
        ],
    )
    delivery_boy = models.ForeignKey(
        DeliveryBoys, on_delete=models.CASCADE, blank=True, null=True
    )
    courier_service_name = models.CharField(max_length=255, blank=True, null=True)
    package_number = models.CharField(max_length=255, blank=True, null=True)
    expected_date_of_delivery = models.DateField(blank=True, null=True)
    tracking_link = models.URLField(blank=True, null=True)
    order = models.ForeignKey(Orders, on_delete=models.CASCADE, blank=True, null=True)

class Cart(models.Model):
    user = models.OneToOneField(Users, null=True, blank=True, on_delete=models.CASCADE)
    anonymous_id = models.CharField(max_length=50, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    coupon = models.ForeignKey('Coupons', null=True, blank=True, on_delete=models.CASCADE)

    def __str__(self):
        return f"Cart for {'anonymous user' + self.anonymous_id if not self.user else self.user.first_name}"  # type: ignore



class CartItem(models.Model):
    cart = models.ForeignKey(Cart, related_name="items", on_delete=models.CASCADE)
    sku = models.ForeignKey("products.SKU", on_delete=models.CASCADE)
    quantity = models.PositiveIntegerField(default=1)

    def __str__(self):
        return f"{self.quantity} of {self.sku.sku_name} in Cart"



class Coupons(models.Model):
    CouponName = models.CharField(max_length=50, null=True, blank=True)
    CouponCode = models.CharField(max_length=50, null=True, blank=True)
    CouponDescription = models.CharField(max_length=250, null=True, blank=True)
    Icon = models.ImageField(upload_to='icons/', null=True, blank=True)
    CouponUsed = models.ManyToManyField(Users, null=True, blank=True)
    CouponOn = models.CharField(choices=[('Category', 'Category'), ('SubCategory', 'SubCategory'), ('Product', 'Product'),('Sku', 'Sku')], max_length = 40)
    ApplicableCategory = models.ManyToManyField(ProductCategory, blank= True)
    ApplicableSubCategory = models.ManyToManyField(ProductSubCategory, blank=True)
    ApplicableProduct = models.ManyToManyField(Products, blank=True)
    ApplicableSku = models.ManyToManyField(SKU, blank=True)
    TotalBillAmount = models.FloatField(max_length=20, null= True, blank=True)
    DiscountAmount = models.IntegerField(null=True, blank=True)
    DiscountPercentage = models.IntegerField(null=True, blank=True)
    CouponType = models.CharField(choices = [('amount','amount'), ('percentage', 'percentage')], max_length=20)
    MaxNumberofUsers = models.IntegerField()
    Validity_start_date =models.DateTimeField()
    validity_end_date = models.DateTimeField()
    TermsAndConditions = models.CharField(max_length=400, null=True, blank=True)
    NotificationSchedule = models.DateTimeField(null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)
    MaxDiscountAmountForPercentage = models.FloatField(null=True, blank=True, help_text="Maximum discount amount when percentage is selected")

    def __str__(self):
        return f"Coupons-{self.CouponName}-{self.CouponCode}"



class DeliverySlot(models.Model):
    start_time = models.TimeField()
    end_time = models.TimeField()
    is_available = models.BooleanField(default=True) 
    status = models.CharField(
        max_length=20, choices=[('active', 'Active'), ('inactive', 'Inactive')], default='active'
    )
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return f"{self.start_time.strftime('%H:%M')} to {self.end_time.strftime('%H:%M')}" # type: ignore
    
    @property
    def duration(self):
        return self.end_time - self.start_time # type: ignore


class Discount(models.Model):
    DiscountName = models.CharField(max_length=50, null=True, blank=True)
    DiscountCode = models.CharField(max_length=50, null=True, blank=True, unique=True)
    DiscountDescription = models.CharField(max_length=250, null=True, blank=True)
    DiscountOn = models.CharField(choices=[('Category', 'Category'), ('SubCategory', 'SubCategory'), ('Product', 'Product'), ('Sku', 'Sku')], max_length=40)
    ApplicableCategory = models.ManyToManyField(ProductCategory, blank=True)
    ApplicableSubCategory = models.ManyToManyField(ProductSubCategory, blank=True)
    ApplicableProduct = models.ManyToManyField(Products, blank=True)
    ApplicableSku = models.ManyToManyField(SKU, blank=True)
    DiscountPercentage = models.DecimalField(max_digits=5, decimal_places=2, null=True, blank=True)  
    created_at = models.DateTimeField(auto_now_add=True)
    StandardImage = models.ImageField(upload_to='standard_images/',null=True,blank=True)
    BannerImage = models.ImageField(upload_to='banners/', null=True, blank=True)

    def __str__(self):
        return f"Discount-{self.DiscountName}-{self.DiscountCode}"



class Ads(models.Model):
    uuid = models.UUIDField(
        primary_key=True, default=uuid.uuid4, unique=True, editable=False
    )
    placement_choices = [('Top', 'Top'), ('Bottom', 'Bottom'), ('Banner', 'Banner')]
    AdTitle = models.CharField(max_length=50, null=True, blank=True)
    AdDescription = models.CharField(max_length=250, null=True, blank=True)
    AdPlacement = models.TextField(max_length=100, blank=True, null=True)
    AdType = models.CharField(choices=[('Discount', 'Discount'), ('Coupon', 'Coupon'), ('Product', 'Product')], max_length=20)
    StandardImage = models.ImageField(upload_to='standard_images/', null=True, blank=True)
    BannerImage = models.ImageField(upload_to='banners/', null=True, blank=True)
    Discount  = models.ForeignKey(Discount, on_delete=models.CASCADE, null=True, blank=True)
    Coupon = models.ForeignKey(Coupons,on_delete=models.CASCADE, null=True, blank=True)
    Product = models.ForeignKey(Products,on_delete=models.CASCADE, null=True, blank=True)

    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.AdTitle

    def get_placement_display(self):
        placement_dict = dict(self.placement_choices)
        if not self.AdPlacement:
            return []
        return [placement_dict[placement] for placement in self.AdPlacement.split(',') if placement in placement_dict]
    
class Message(models.Model):
    MESSAGE_TYPE_CHOICES = [
        ('Email', 'Email'),
        ('Sms', 'SMS'),
        ('Whatsapp', 'WhatsApp')
    ]
    uuid = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    message_type = models.CharField(max_length=20, choices=MESSAGE_TYPE_CHOICES)
    message = models.TextField(null=True, blank=True)
    ads = models.ForeignKey(Ads, on_delete=models.CASCADE, null=True, blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.message_type


class Communication(models.Model):
    user = models.ForeignKey(Users, limit_choices_to={"user_type":"Customer"}, on_delete= models.CASCADE)
    message = models.ForeignKey(Message,on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    is_send = models.BooleanField(default=False)

    def __str__(self):
        return f"{self.message} - {self.user}"



class Payment(models.Model):
    order = models.OneToOneField(Orders, on_delete=models.CASCADE)
    razorpay_payment_id = models.CharField(max_length=255, null=True, blank=True)
    razorpay_order_id = models.CharField(max_length=255, null=True, blank=True)
    payment_status = models.CharField(max_length=50, choices=[
        ('pending', 'Pending'),
        ('paid', 'Paid'),
        ('failed', 'Failed'),
    ], default='pending')
    payment_date = models.DateTimeField(auto_now_add=True)
    
    def __str__(self):
        return f"Payment for {self.order.order_ID} - Status: {self.payment_status}"




class NotificationStat(models.Model):
    Sendmsg = models.CharField(max_length=100)
    sendTo=models.ForeignKey(Users,on_delete=models.CASCADE)
    OrderID=models.ForeignKey(Orders,on_delete=models.CASCADE)
    Description = models.CharField(max_length=1000, blank = True, null= True)
    created_date=models.DateTimeField(auto_now_add=True)
    updated_date=models.DateTimeField(auto_now=True)

    def __str__(self):
        return str(self.OrderID)+str(self.sendTo)


