from django.db import models
from app_account.models import CustomUser



class PropertyUse(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نوع کاربری"
    )
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tbl_property_use'
        verbose_name = 'کاربری ملک'
        verbose_name_plural = 'جدول انواع کاربری'


class PropertyType(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="نوع ملک"
    )
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tbl_property_type'
        verbose_name = 'نوع ملک'
        verbose_name_plural = 'جدول انواع ملک'


class PriceRange(models.Model):
    name = models.CharField(
        max_length=100, 
        unique=True, 
        verbose_name="بازه قیمتی"
    )
    def __str__(self):
        return self.name
    class Meta:
        db_table = 'tbl_price_range'
        verbose_name = 'بازه قیمتی'
        verbose_name_plural = 'جدول بازه قیمتی'


class EstateInfo(models.Model):
    consultant = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True, 
        verbose_name='مشاور',
        related_name='consultant_estateinfo_set',  
        limit_choices_to=models.Q(is_staff=True) | models.Q(is_superuser=True) 
    )

    customer = models.ForeignKey(
        CustomUser,
        on_delete=models.DO_NOTHING,
        blank=True, 
        null=True,
        verbose_name='مشتری',
        related_name='customer_estateinfo_set', 
        limit_choices_to=~models.Q(is_staff=True)  
    
    )

    property_use = models.CharField(
        max_length=20, 
        blank=True,  
        verbose_name='کاربری ملک'
    )

    property_type = models.CharField(
        max_length=20, 
        blank=True, 
        verbose_name='نوع ملک'
    )

    class BargainTypeChoices(models.TextChoices):
        BuySell = 'buy_sell', "خرید و فروش"
        MortgageRent = 'mortgageـrent', "رهن و اجاره"
    bargain_type = models.CharField(
        max_length=20,
        blank=True, 
        choices= BargainTypeChoices.choices,
        verbose_name='نوع معامله'
    )
    mortgage_price = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت رهن'
    )
    rent_price = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت اجاره'
    )
    sellـprice = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='قیمت فروش'
    )
    year_manufacture = models.IntegerField(
        blank=True,  
        verbose_name='سال ساخت'
    )
    floor_number = models.IntegerField(
        blank=True, 
        verbose_name='شماره طبقه'
    )
    units_per_floor = models.IntegerField(
        blank=True, 
        verbose_name='تعداد واحد در طبقه'
    )
    class OwnershipTypeChoices(models.TextChoices):
        SingleSheetDocument = 'single_sheet_document', "سند تک برگی"
        BookletDocument = 'booklet_document' , "سند دغترچه ای"
        WrittePromise = 'written_promise', "قولنامه"
    ownership_document_type = models.CharField(
        max_length=30,
        blank=True, 
        choices= OwnershipTypeChoices.choices,
        verbose_name='نوع سند مالکیت'
    )
    useful_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ مفید'
    )
    is_parking = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='پارکینگ دارد'
    )
    parking_size = models.FloatField( 
        default= 0.0,
        blank=True, 
        verbose_name='متراژ پارکینگ'
    )
    is_warehouse = models.BooleanField(
        default=False,
        blank=True, 
        null= True,
        verbose_name='انباری دارد'
    )
    warehouse_size = models.FloatField(
        default= 0.0,
        blank=True, 
        verbose_name='متراژ انباری'
    )
    
    def __str__(self) -> str:
        return f"{self.consultant}/{self.customer}"

    class Meta:
        db_table = 'tbl_estate_info'
        verbose_name = 'ملک'
        verbose_name_plural = 'مشخصات ملک'




from django.contrib import admin
from .models import PropertyUse, PropertyType, EstateInfo, PriceRange
from .forms import EstateInfoForm


class BaseAdmin(admin.ModelAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(PropertyUse)
class PropertyUseAdmin(BaseAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(PropertyType)
class PropertyTypeAdmin(BaseAdmin):
    list_display = ('name',)
    search_fields = ('name',)

@admin.register(PriceRange)
class PriceRangeAdmin(BaseAdmin):
    list_display = ('name',)
    search_fields = ('name',)


@admin.register(EstateInfo)
class EstateInfoAdmin(admin.ModelAdmin):
    form = EstateInfoForm
    change_form_template = 'admin/app_estate/EstateInfo/change_form.html'
    list_display = (
        'property_use', 'property_type', 'bargain_type',
        'get_consultant_full_name', 'get_customer_full_name',
    )
    search_fields = (
        'consultant__first_name', 'consultant__last_name', 
        'customer__first_name', 'customer__last_name',
        'property_use', 'property_type', 'bargain_type',
    )
    autocomplete_fields = ('consultant', 'customer')

    fieldsets = (
        ('اطلاعات مشتزی و مشاور', {'fields': ('consultant', 'customer')}),
        ('اطلاعات عمومی ملک', {'fields': ('property_use', 'property_type', 'bargain_type', 'year_manufacture', 'floor_number', 'units_per_floor', 'ownership_document_type')}),
        ('اطلاعات قیمتی ملک', {'fields': ('sellـprice', 'mortgage_price' ,'rent_price')}),
        ('متراژ ملک', {'fields': ('useful_size', 'is_parking', 'parking_size' , 'is_warehouse', 'warehouse_size')}),



    )
    # add_fieldsets = (

    def get_extra_context(self, request):
        return {
            'property_use_list': list(PropertyUse.objects.values_list('name', flat=True)),
            'property_type_list': list(PropertyType.objects.values_list('name', flat=True)),
            'price_range_list': list(PriceRange.objects.values_list('name', flat=True)),
        }

    def add_view(self, request, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().add_view(request, form_url, extra_context=extra_context)

    def change_view(self, request, object_id, form_url='', extra_context=None):
        extra_context = extra_context or {}
        extra_context.update(self.get_extra_context(request))
        return super().change_view(request, object_id, form_url, extra_context=extra_context)

    def get_consultant_full_name(self, obj):
        return f"{obj.consultant.first_name} {obj.consultant.last_name}"
    get_consultant_full_name.short_description = 'نام مشاور'

    def get_customer_full_name(self, obj):
        return f"{obj.customer.first_name} {obj.customer.last_name}"
    get_customer_full_name.short_description = 'نام مشتری'


با توجه به کد بالا کاری کن که بتونم یک فیلتر برای تعیین رکوردهایی که  بازه قیمت فروش بین دو عدد رو برام نشون بدهدر پنل ادمین