from django.db import models


class Facility(models.Model):

    FLOOR_CHOICES = [
        ('G', 'همکف (Ground)'),
        ('1', 'طبقه اول'),
        ('2', 'طبقه دوم'),
        ('3', 'طبقه سوم'),
        ('4', 'طبقه چهارم'),
        ('5', 'طبقه پنجم'),
        ('6', 'طبقه ششم'),
        ('7', 'طبقه هفتم'),
    ]

    FACILITY_TYPES = [
        ('CLASSROOM', 'صنف'),
        ('LABORATORY', 'لابراتوار'),
        ('OFFICE', 'دفتر'),
        ('MEETING_ROOM', 'اتاق جلسه'),
        ('SERVER_ROOM', 'سرور روم'),
        ('STORE', 'گدام'),
        ('OTHER', 'سایر'),
    ]

    STATUS_CHOICES = [
        ('ACTIVE', 'فعال'),
        ('INACTIVE', 'غیرفعال'),
    ]

    code = models.CharField(
        max_length=20,
        unique=True,
        verbose_name='کد مکان'
    )

    name = models.CharField(
        max_length=150,
        verbose_name='نام مکان'
    )

    facility_type = models.CharField(
        max_length=30,
        choices=FACILITY_TYPES,
        verbose_name='نوع مکان'
    )

    building = models.CharField(
        max_length=100,
        blank=True,
        verbose_name='تعمیر'
    )

    floor = models.CharField(
        max_length=50,
        choices=FLOOR_CHOICES,
        verbose_name='طبقه'
    )

    room_number = models.CharField(
        max_length=30,
        blank=True,
        verbose_name='شماره اتاق'
    )

    capacity = models.PositiveIntegerField(
        null=True,
        blank=True,
        verbose_name='ظرفیت'
    )

    responsible_person = models.CharField(
        max_length=150,
        blank=True,
        verbose_name='مسؤول'
    )

    description = models.TextField(
        blank=True,
        verbose_name='توضیحات'
    )

    status = models.CharField(
        max_length=20,
        choices=STATUS_CHOICES,
        default='ACTIVE',
        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 save(self, *args, **kwargs):
        if not self.code:

            if self.floor == 'G':
                last_facility = (
                    Facility.objects
                    .filter(code__startswith='G')
                    .order_by('-code')
                    .first()
                )

                if last_facility:
                    last_number = int(last_facility.code[1:])
                    next_number = last_number + 1
                else:
                    next_number = 1

                self.code = f'G{next_number:02d}'

            else:
                last_facility = (
                    Facility.objects
                    .filter(code__startswith=self.floor)
                    .exclude(code__startswith='G')
                    .order_by('-code')
                    .first()
                )

                if last_facility:
                    last_number = int(last_facility.code)
                    next_number = last_number + 1
                else:
                    next_number = int(self.floor) * 100 + 1

                self.code = str(next_number)

        super().save(*args, **kwargs)

    def __str__(self):
        return f'{self.code} - {self.name}'