from django.db import models
from django.contrib.auth.models import User


class Organization(models.Model):
    name = models.CharField(max_length=200, unique=True, verbose_name='نام سازمان')
    description = models.TextField(blank=True, verbose_name='توضیحات')
    created_at = models.DateTimeField(auto_now_add=True)

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'سازمان'
        verbose_name_plural = 'سازمان ها'


class UserProfile(models.Model):
    USER_TYPES = (
        ('owner', 'مدیر'),
        ('employee', 'کارمند'),
    )

    user = models.OneToOneField(User, on_delete=models.CASCADE)
    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, verbose_name='سازمان')
    user_type = models.CharField(max_length=10, choices=USER_TYPES, verbose_name='نقش کاربر')
    phone = models.CharField(max_length=30, verbose_name='شماره تماس')

    def __str__(self):
        return f"{self.user.username} - {self.organization.name}"

    class Meta:
        verbose_name = 'پروفایل کاربر'
        verbose_name_plural = 'پروفایل های کاربر'


class Location(models.Model):
    name = models.CharField(max_length=200, unique=True, verbose_name='نام مکان')
    description = models.TextField(blank=True, verbose_name='توضیحات')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'مکان'
        verbose_name_plural = 'مکان ها'


class ItemType(models.Model):
    name = models.CharField(max_length=200, unique=True, verbose_name='نام نوع دارایی')
    description = models.TextField(blank=True, verbose_name='توضیحات')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'نوع دارایی'
        verbose_name_plural = 'انواع دارایی'


class Unit(models.Model):
    name = models.CharField(max_length=100, unique=True, verbose_name='نام واحد')
    abbreviation = models.CharField(max_length=20, blank=True, verbose_name='اختصار')

    def __str__(self):
        return self.name

    class Meta:
        verbose_name = 'واحد'
        verbose_name_plural = 'واحدها'


class Custodian(models.Model):
    STATUS_CHOICES = (
        ('pending', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
        ('rejected', 'رد شده'),
    )

    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, verbose_name='سازمان')
    first_name = models.CharField(max_length=100, verbose_name='نام')
    last_name = models.CharField(max_length=100, verbose_name='نام خانوادگی')
    job_title = models.CharField(max_length=200, verbose_name='سمت')
    phone = models.CharField(max_length=30, verbose_name='شماره تماس')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='وضعیت')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='created_custodians', verbose_name='ثبت کننده')
    approved_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='approved_custodians', verbose_name='تایید کننده')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ثبت')
    approved_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ تایید')

    def full_name(self):
        return f"{self.first_name} {self.last_name}".strip()

    full_name.short_description = 'نام و نام خانوادگی'

    def __str__(self):
        return self.full_name()

    class Meta:
        verbose_name = 'امین اموال'
        verbose_name_plural = 'امین های اموال'


class Asset(models.Model):
    AVAILABILITY_CHOICES = (
        ('available', 'موجود'),
        ('unavailable', 'ناموجود'),
    )
    STATUS_CHOICES = (
        ('pending', 'در انتظار تایید'),
        ('approved', 'تایید شده'),
        ('rejected', 'رد شده'),
        ('purchase_requested', 'درخواست خرید'),
        ('purchase_approved', 'خرید تایید شد'),
        ('purchase_rejected', 'خرید رد شد'),
        ('purchase_received', 'دریافت شد'),
    )

    organization = models.ForeignKey(Organization, on_delete=models.CASCADE, verbose_name='سازمان')
    name = models.CharField(max_length=200, default='', verbose_name='نام دارایی')
    item_type = models.ForeignKey(ItemType, on_delete=models.CASCADE, verbose_name='نوع دارایی')
    location = models.ForeignKey(Location, on_delete=models.CASCADE, verbose_name='مکان')
    custodian = models.ForeignKey(Custodian, on_delete=models.SET_NULL, null=True, blank=True, verbose_name='امین اموال')
    availability = models.CharField(max_length=12, choices=AVAILABILITY_CHOICES, default='available', verbose_name='وضعیت موجودی')
    description = models.TextField(verbose_name='توضیحات')
    unit = models.ForeignKey(Unit, on_delete=models.CASCADE, null=True, blank=True, verbose_name='واحد')
    status = models.CharField(max_length=20, choices=STATUS_CHOICES, default='pending', verbose_name='وضعیت')
    created_by = models.ForeignKey(User, on_delete=models.CASCADE, related_name='created_assets', verbose_name='ثبت کننده')
    approved_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='approved_assets', verbose_name='تایید کننده')
    created_at = models.DateTimeField(auto_now_add=True, verbose_name='تاریخ ثبت')
    approved_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ تایید')
    received_by = models.ForeignKey(User, on_delete=models.SET_NULL, null=True, blank=True, related_name='received_assets', verbose_name='دریافت کننده')
    received_at = models.DateTimeField(null=True, blank=True, verbose_name='تاریخ دریافت')

    def __str__(self):
        display_name = self.name or self.item_type.name
        return f"{display_name} - {self.organization.name}"

    class Meta:
        verbose_name = 'دارایی'
        verbose_name_plural = 'دارایی ها'
