from django.db import models
from django.conf import settings
from django.contrib.auth.models import User
from core.models import Service

class Category(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField(blank=True)

    def __str__(self):
        return self.name


class WarehouseItem(models.Model):
    name = models.CharField(max_length=255)
    quantity = models.PositiveIntegerField()
    description = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    updated_at = models.DateTimeField(auto_now=True)
    created_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True,
                                   related_name='created_items')
    updated_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True,
                                   related_name='updated_items')
    category = models.ForeignKey(Category, on_delete=models.SET_NULL, null=True)
    min_quantity = models.PositiveIntegerField(default=0)
    unit_price = models.DecimalField(max_digits=10, decimal_places=2, default=0)
    expiration_date = models.DateField(null=True, blank=True)
    location = models.CharField(max_length=100, blank=True)
    barcode = models.CharField(max_length=100, unique=True, blank=True, null=True)

    @property
    def total_value(self):
        return self.quantity * self.unit_price

    @property
    def needs_restock(self):
        return self.quantity <= self.min_quantity

    def __str__(self):
        return self.name


class WarehouseItemHistory(models.Model):
    HISTORY_TYPE_CHOICES = [
        ('creation', 'Creation'),
        ('sale', 'Sale'),
        ('update', 'Update'),
    ]

    item = models.ForeignKey(WarehouseItem, on_delete=models.CASCADE, related_name='history')
    quantity_changed = models.IntegerField()  # Can be positive or negative
    unit_price_changed = models.DecimalField(max_digits=10, decimal_places=2, null=True, blank=True)  # Add this line
    changed_by = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.SET_NULL, null=True)
    changed_at = models.DateTimeField(auto_now_add=True)
    description = models.TextField(blank=True, null=True)
    history_type = models.CharField(max_length=10, choices=HISTORY_TYPE_CHOICES, default='update')

    class Meta:
        ordering = ['-changed_at']




class MedicinePack(models.Model):
    name = models.CharField(max_length=255)
    service = models.ForeignKey(
        Service,
        on_delete=models.CASCADE,
        related_name="services_pack",
        null=True
    )
    description = models.TextField(blank=True, null=True)
    created_at = models.DateTimeField(auto_now_add=True)
    created_by = models.ForeignKey(
        settings.AUTH_USER_MODEL,
        on_delete=models.SET_NULL,
        null=True
    )
    total_value = models.DecimalField(
        max_digits=10,
        decimal_places=2,
        default=0
    )

    class Meta:
        verbose_name = "medical pack"
        verbose_name_plural = "medical packs"
        ordering = ['-created_at']

    def __str__(self):
        return self.name

    def calculate_total_value(self):
        """محاسبه ارزش کل پک"""
        total = sum(item.total_value for item in self.items.all())
        self.total_value = total
        self.save()
        return total


class MedicinePackItem(models.Model):
    pack = models.ForeignKey(
        MedicinePack,
        on_delete=models.CASCADE,
        related_name='items'
    )
    medicine = models.ForeignKey(
        'WarehouseItem',  # فرض می‌کنم مدل دارو WarehouseItem است
        on_delete=models.CASCADE
    )
    quantity = models.PositiveIntegerField(verbose_name="تعداد")
    unit_price = models.DecimalField(
        max_digits=10,
        decimal_places=2
    )

    class Meta:
        verbose_name = "tem pack"
        verbose_name_plural = "Items pack"
        unique_together = ['pack', 'medicine']  # یک دارو فقط یکبار در هر پک

    @property
    def total_value(self):
        """محاسبه ارزش کل این آیتم"""
        return self.quantity * self.unit_price

    def __str__(self):
        return f"{self.pack.name} - {self.medicine.name} ({self.quantity})"