from django.db import models


class AssetCategory(models.Model):
    name = models.CharField(
        max_length=100,
        unique=True,
        verbose_name='نام دسته'
    )

    code = models.CharField(
        max_length=30,
        unique=True,
        verbose_name='کد دسته'
    )

    description = models.TextField(
        blank=True,
        verbose_name='توضیحات'
    )

    is_active = models.BooleanField(
        default=True,
        verbose_name='فعال'
    )

    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='تاریخ ایجاد'
    )

    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name='آخرین تغییر'
    )

    class Meta:
        verbose_name = 'دسته تجهیزات'
        verbose_name_plural = 'دسته‌های تجهیزات'
        ordering = ('name',)

    def __str__(self):
        return f'{self.code} - {self.name}'


class Asset(models.Model):

    STATUS_CHOICES = [
        ('ACTIVE', 'فعال'),
        ('INACTIVE', 'غیرفعال'),
        ('DAMAGED', 'خراب'),
        ('UNDER_REPAIR', 'تحت ترمیم'),
        ('LOST', 'مفقود'),
        ('DISPOSED', 'خارج شده'),
        ('STORED', 'در گدام'),
    ]

    CONDITION_CHOICES = [
        ('NEW', 'جدید'),
        ('GOOD', 'خوب'),
        ('FAIR', 'متوسط'),
        ('DAMAGED', 'خراب'),
    ]

    category = models.ForeignKey(
        AssetCategory,
        on_delete=models.PROTECT,
        related_name='assets',
        verbose_name='دسته تجهیزات'
    )

    asset_code = models.CharField(
        max_length=50,
        unique=True,
        verbose_name='کد تجهیز'
    )

    name = models.CharField(
        max_length=200,
        verbose_name='نام تجهیز'
    )

    brand = models.CharField(
        max_length=100,
        blank=True,
        verbose_name='برند'
    )

    model = models.CharField(
        max_length=100,
        blank=True,
        verbose_name='مدل'
    )

    serial_number = models.CharField(
        max_length=150,
        blank=True,
        verbose_name='شماره سریال'
    )

    quantity = models.PositiveIntegerField(
        default=1,
        verbose_name='تعداد'
    )

    location = models.ForeignKey(
        'facilities.Facility',
        on_delete=models.PROTECT,
        related_name='assets',
        verbose_name='مکان'
    )

    condition = models.CharField(
        max_length=20,
        choices=CONDITION_CHOICES,
        default='GOOD',
        verbose_name='حالت'
    )

    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='ACTIVE',
        verbose_name='وضعیت'
    )

    purchase_date = models.DateField(
        null=True,
        blank=True,
        verbose_name='تاریخ خرید'
    )

    purchase_price = models.DecimalField(
        max_digits=12,
        decimal_places=2,
        null=True,
        blank=True,
        verbose_name='قیمت خرید'
    )

    warranty_expiry = models.DateField(
        null=True,
        blank=True,
        verbose_name='تاریخ ختم گارانتی'
    )

    description = models.TextField(
        blank=True,
        verbose_name='توضیحات'
    )

    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='تاریخ ایجاد'
    )

    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name='آخرین تغییر'
    )

    class Meta:
        verbose_name = 'تجهیز'
        verbose_name_plural = 'تجهیزات'
        ordering = ('asset_code',)

    def save(self, *args, **kwargs):
        if not self.asset_code:

            prefix = self.category.code

            last_asset = (
                Asset.objects
                .filter(asset_code__startswith=f'{prefix}-')
                .order_by('-asset_code')
                .first()
            )

            if last_asset:
                last_number = int(
                    last_asset.asset_code.split('-')[-1]
                )
                next_number = last_number + 1
            else:
                next_number = 1

            self.asset_code = f'{prefix}-{next_number:04d}'

        super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.asset_code} - {self.name}'


class AssetSpecification(models.Model):

    asset = models.ForeignKey(
        Asset,
        on_delete=models.CASCADE,
        related_name='specifications',
        verbose_name='تجهیز'
    )

    key = models.CharField(
        max_length=100,
        verbose_name='مشخصه'
    )

    value = models.CharField(
        max_length=255,
        verbose_name='مقدار'
    )

    created_at = models.DateTimeField(
        auto_now_add=True,
        verbose_name='تاریخ ایجاد'
    )

    updated_at = models.DateTimeField(
        auto_now=True,
        verbose_name='آخرین تغییر'
    )

    class Meta:
      verbose_name = 'مشخصات تخنیکی'
      verbose_name_plural = 'مشخصات تخنیکی'
      ordering = ('key',)

      constraints = [
        models.UniqueConstraint(
            fields=['asset', 'key'],
            name='unique_asset_specification_key'
        )
    ]

    def __str__(self):
        return f'{self.asset.asset_code} - {self.key}: {self.value}'