# from typing_extensions import Required
from django.db import models
from django.contrib.auth.models import User
from django.db.models.fields import SlugField, URLField
from django.utils.timezone import datetime
from django.utils import timezone
from datetime import date, time
from django.urls import reverse
from django.utils.text import slugify

class MainBanner(models.Model):
    image = models.ImageField(upload_to="banner/")
    is_mobileview = models.BooleanField(default=False)
    link = models.URLField(max_length=2048,null=True,default="xygame.co")
   
    def __str__(self):
        return self.link

class SubBanner(models.Model):
    image = models.ImageField(upload_to="subbanner/",null=True,blank=True)
    link = models.URLField(max_length=2048,null=True,default="xygame.co")

    def __str__(self):
        return self.link

class NavBanner(models.Model):
    image = models.ImageField(upload_to="navbanner/",null=True,blank=True)
    link = models.URLField(max_length=2048,null=True,default="xygame.co")

    def __str__(self):
        return self.link

class Header(models.Model):
    name = models.CharField(max_length=100)
    time_stamp = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

class Category(models.Model):
    header = models.ForeignKey(Header,on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    slug = models.SlugField(null=True,default="undetermined")
    image = models.ImageField(upload_to="maincategory/",null=True,blank=True)
    featured = models.BooleanField(default=False)
    is_bestselling = models.BooleanField(default=False)
    isdigital = models.BooleanField(default=True)
    display = models.BooleanField(default=True)

    def __str__(self):
        if self.header and self.header.name:
            return f"{self.name} of {self.header.name}"
        return self.name or "Unnamed Category"


class SubCategory(models.Model):
    category = models.ForeignKey(Category,on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    slug = models.SlugField(null=True,default="undetermined")
    image = models.ImageField(upload_to="sc/")
    title = models.CharField(max_length=500,null=True)
    publisher = models.CharField(max_length=500,null=True)
    developer = models.CharField(max_length=500,null=True)
    release_date = models.CharField(max_length=500,null=True)
    genre = models.CharField(max_length=500,null=True)
    language = models.CharField(max_length=500,null=True)
    region = models.CharField(max_length=500,null=True)
    platform = models.CharField(max_length=500,null=True)
    delivery_mode = models.CharField(max_length=500,null=True)
    delivery_time = models.CharField(max_length=500,null=True)
    isdigital = models.BooleanField(default=True)
    display = models.BooleanField(default=True)

    def __str__(self):
        return self.name or "Unnamed SubCategory"

class Product(models.Model):
    subcategory = models.ForeignKey(SubCategory,on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    slug = models.SlugField(null=True,default="undetermined")
    description = models.TextField(null=True)
    price = models.FloatField()
    dprice = models.FloatField(null=True)
    points = models.PositiveIntegerField(default=0)
    image = models.ImageField(upload_to="products/")
    is_details = models.BooleanField(default=False)
    detail_one = models.CharField(max_length=100,blank=True,null=True)
    detail_two = models.CharField(max_length=100,blank=True,null=True)
    detail_three = models.CharField(max_length=100,blank=True,null=True)
    popular = models.IntegerField(default=0)
    outofstock = models.BooleanField(default=False)
    isdigital = models.BooleanField(default=True)
    display = models.BooleanField(default=True)

    def __str__(self):
        if self.subcategory and self.subcategory.name:
            return f"{self.name} of {self.subcategory.name}"
        return self.name or "Unnamed Product"

class Order(models.Model):
    username = models.ForeignKey(User,on_delete = models.CASCADE)
    ordered_date = models.DateField(auto_now_add=True,null=True)
    ordered_time = models.TimeField(auto_now_add = True,null=True)
    Amount = models.FloatField(null=True)
    item_length = models.IntegerField(null=True)
    status = models.CharField(max_length=100, default="Pending", null=True)
    admin_username = models.CharField(max_length=150, null=True, blank=True)
    payment_getway = models.CharField(max_length=50, null=True, blank=True)
    approved = models.BooleanField(default=False)
    pidx = models.CharField(max_length=100, null=True, blank=True)
    coupon = models.ForeignKey('Coupons', on_delete=models.SET_NULL, null=True, blank=True)
    coupon_code = models.CharField(max_length=255, null=True, blank=True)
    discount_amount = models.FloatField(default=0.0)

class OrderItem(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    order = models.ForeignKey(Order, on_delete=models.CASCADE, null=True)
    destination_one = models.CharField(max_length=100, null=True)
    destination_two = models.CharField(max_length=100, null=True)
    destination_three = models.CharField(max_length=100,null=True)
    quantity = models.IntegerField(default=0, null=True, blank=True)
    Screenshot = models.ImageField(upload_to='imess/', null=True, blank=True, default=False)
    phonenum = models.CharField(max_length=100,null=True,blank=True)
    
    @property
    def total_price(self):
        return self.quantity * self.product.price

class SerialCode(models.Model):
    product = models.ForeignKey(Product,on_delete=models.CASCADE,null=True)
    serial_key = models.CharField(max_length=200)
    status = models.CharField(max_length=100,default="Active",null=True)
    
    def __str__(self):
        return f"{self.subcategory}"

class UserProfile(models.Model):
    user = models.ForeignKey(User,on_delete = models.CASCADE)
    category = models.CharField(max_length=100,null=True)
    code = models.TextField()
    date = models.DateTimeField(auto_now_add=True,null=True)
    
    
class OrderUserProfile(models.Model):
    order = models.ForeignKey(Order, on_delete=models.CASCADE)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    category = models.CharField(max_length=100, null=True)
    code = models.TextField(null=True, blank=True)
    date = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        text = "XY00" + str(self.order.id) + "0GG"
        return text


class UserShowProfile(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    phone = models.CharField(max_length=100)
    image = models.ImageField(upload_to="usersphotos")
    
    def __str__(self):
        return self.user.username

class Profile(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    distributor = models.BooleanField(default=False)
    points = models.PositiveIntegerField(default=0)
    image = models.ImageField(upload_to="profile/",null=True)
    phone = models.CharField(max_length=15)
    is_verified = models.BooleanField(default=False)


    def __str__(self):
        return self.user.username

class RequestForDistributor(models.Model):
    user_profile = models.ForeignKey(Profile,on_delete=models.CASCADE)
    
class Review(models.Model):
    name = models.CharField(max_length=100)
    email = models.CharField(max_length=100)
    title = models.CharField(max_length=100)
    rating = models.CharField(max_length=100)
    review = models.TextField()
    date = models.DateField(auto_now=True)

    def __str__(self):
        return self.name

class Testimonials(models.Model):
    name = models.CharField(max_length=100)
    image = models.ImageField(upload_to="testimonials")
    title = models.CharField(max_length=100)
    rating = models.CharField(max_length=100)
    review = models.TextField()
    date = models.DateField(auto_now_add=True,null=True)

    def __str__(self):
        return self.name


class Coupons(models.Model):
    coupon_code = models.CharField(max_length=255, unique=True)
    product = models.ForeignKey(Product, on_delete=models.SET_NULL, null=True, blank=True, related_name="coupons")
    products = models.ManyToManyField(Product, blank=True, related_name="multi_coupons")
    discount_price = models.FloatField(default=0)
    discount_percent = models.IntegerField(default=0)
    ispercent_discount = models.BooleanField(default=False)
    isprice_discount = models.BooleanField(default=False)
    isactive = models.BooleanField(default=True)
    valid_from = models.DateTimeField(default=timezone.now, null=True, blank=True)
    valid_to = models.DateTimeField(null=True, blank=True)
    max_uses = models.PositiveIntegerField(default=0, help_text="Total usage limit across all users (0 = unlimited)")
    max_uses_per_user = models.PositiveIntegerField(default=1, help_text="Maximum redemptions per user (default 1)")
    used_count = models.PositiveIntegerField(default=0, help_text="Total number of times redeemed")
    min_purchase_amount = models.FloatField(default=0.0, help_text="Minimum item amount required to apply")

    def __str__(self):
        return self.coupon_code

    def is_valid_now(self):
        now = timezone.now()
        if not self.isactive:
            return False, "Coupon is currently inactive."
        if self.valid_from and now < self.valid_from:
            return False, "Coupon promotion has not started yet."
        if self.valid_to and now > self.valid_to:
            return False, "Coupon has expired."
        if self.max_uses > 0 and self.used_count >= self.max_uses:
            return False, "Coupon usage limit has been reached."
        return True, "Valid"

    def can_user_use(self, user):
        if not user or not user.is_authenticated:
            return False, "Please log in to redeem this coupon."
        redemptions = CouponReedemBy.objects.filter(coupon=self, user=user).count()
        if self.max_uses_per_user > 0 and redemptions >= self.max_uses_per_user:
            return False, "You have already used this coupon the maximum allowed times."
        return True, "Eligible"

    def applies_to_product(self, product_id):
        try:
            p_id = int(product_id)
        except (TypeError, ValueError):
            return False
        if self.product_id and self.product_id == p_id:
            return True
        if self.products.filter(id=p_id).exists():
            return True
        return False

    def calculate_discount_for_item(self, unit_price, quantity=1):
        try:
            unit_price = float(unit_price)
            quantity = int(quantity)
        except (TypeError, ValueError):
            return 0.0
        line_total = unit_price * max(1, quantity)
        if self.min_purchase_amount > 0 and line_total < self.min_purchase_amount:
            return 0.0
        if self.isprice_discount:
            discount = float(self.discount_price)
            return round(min(discount, line_total), 2)
        elif self.ispercent_discount:
            pct = min(100, max(0, int(self.discount_percent)))
            discount = (line_total * pct) / 100.0
            return round(min(discount, line_total), 2)
        return 0.0


class CouponReedemBy(models.Model):
    coupon = models.ForeignKey(Coupons, on_delete=models.SET_NULL, null=True, related_name="redemptions")
    user = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, related_name="coupon_redemptions")
    order = models.ForeignKey('Order', on_delete=models.SET_NULL, null=True, blank=True, related_name="coupon_redemptions")
    discount_amount = models.FloatField(default=0.0)
    redeemed_at = models.DateTimeField(auto_now_add=True, null=True)

    def __str__(self):
        c_code = self.coupon.coupon_code if self.coupon else "Deleted Coupon"
        u_name = self.user.username if self.user else "Unknown User"
        return f"{c_code} by {u_name}"


class ShortageRegister(models.Model):
    user = models.ForeignKey(User,on_delete=models.CASCADE)
    product = models.ForeignKey(Product,on_delete=models.CASCADE)
    req_for = models.CharField(max_length=100)
    we_have = models.CharField(max_length=100)
    date = models.DateField(auto_now=True)
    remarks = models.TextField()

class Contact(models.Model):
    full_name = models.CharField(max_length=100)
    phone_number = models.CharField(max_length=15)
    email = models.EmailField(max_length=100)
    message = models.TextField()
    date = models.DateTimeField(auto_now_add=True,null=True)

    def __str__(self):
        return self.full_name


class Info(models.Model):
    title = models.CharField(max_length=254, unique=True)
    description_text = models.TextField()
    slug = models.CharField(max_length=256, blank=True, null=True)
    added_date = models.DateField(auto_now_add=True)
    updated_date = models.DateField(auto_now=True)
    is_draft = models.BooleanField(default=False)
    last_update_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True)

    def __str__(self):
        return self.title

    def save(self, *args, **kwargs):
        if not self.pk:
            self.slug = slugify(self.title)
        return super().save(*args, **kwargs)
        
        
class Error(models.Model):
    title = models.CharField(max_length=254, unique=True)
    description_text = models.TextField()
    is_active = models.BooleanField(default=False)

    def __str__(self):
        return self.title


class Imepay(models.Model):
    merchant_code = models.CharField(max_length=10)
    tran_amount = models.FloatField()
    ref_id = models.CharField(max_length=36)
    token_id = models.CharField(max_length=20)
    transaction_id = models.CharField(max_length=20)
    msisdn = models.CharField(max_length=20)
    ime_txn_status = models.IntegerField(null=True)
    request_date = models.DateTimeField(auto_now_add=True)
    response_date = models.DateTimeField(auto_now_add=True)


class FcmToken(models.Model):
    user = models.OneToOneField(User, on_delete=models.SET_NULL, null=True)
    fcm_token = models.TextField(null=True)


class PaymentQR(models.Model):
    title = models.CharField(max_length=100, default="Payment QR Code")
    image = models.ImageField(upload_to="qr/")
    instructions = models.TextField(default="Please scan the QR code to make payment, then upload your payment screenshot and enter your mobile/transaction ID below.", blank=True, null=True)
    is_active = models.BooleanField(default=True)
    updated_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

