from adminsortable2.admin import SortableInlineAdminMixin, SortableAdminMixin
from django import forms
from django.contrib.admin.widgets import FilteredSelectMultiple
from django.conf import settings
from . import models as coreModel
from django.contrib import admin


class InlineSubcategory(SortableInlineAdminMixin, admin.StackedInline):
    model = coreModel.Subcategory
    extra = 0
    list_display = ('name', 'category__name', 'parent', 'icon_tag')
    staff_fieldsets = (
        (None, {'fields': ('description',)}),
    )

    def get_fieldsets(self, request, obj=None):
        if not request.user.is_superuser:
            return self.staff_fieldsets
        return super().get_fieldsets(request, obj)


@admin.register(coreModel.Category)
class CategoryAdmin(SortableAdminMixin, admin.ModelAdmin):
    list_display = ('name', 'icon_tag')
    inlines = [InlineSubcategory]
    staff_fieldsets = (
        (None, {'fields': ()}),
    )

    def change_view(self, request, *args, **kwargs):
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                response = super(CategoryAdmin, self).change_view(request, *args, **kwargs)
            finally:
                self.fieldsets = CategoryAdmin.fieldsets
            return response
        else:
            return super(CategoryAdmin, self).change_view(request, *args, **kwargs)


@admin.register(coreModel.Subcategory)
class SubcategoryAdmin(SortableAdminMixin, admin.ModelAdmin):
    list_display = ('name', 'icon_tag')
    search_fields = ('name', )
    list_filter = ('category__name',)
    list_per_page = settings.LIST_PER_PAGE
    staff_readonly_fields = ('name', 'category')
    staff_fieldsets = (
        (None, {'fields': ('name', 'category', 'description',)}),
    )

    def change_view(self, request, *args, **kwargs):
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                self.readonly_fields = self.staff_readonly_fields
                response = super(SubcategoryAdmin, self).change_view(request, *args, **kwargs)
            finally:
                self.fieldsets = SubcategoryAdmin.fieldsets
                self.readonly_fields = SubcategoryAdmin.readonly_fields
            return response
        else:
            return super(SubcategoryAdmin, self).change_view(request, *args, **kwargs)


class InlineBrandOriginality(admin.TabularInline):
    model = coreModel.BrandOriginality
    extra = 0
    list_display = ('name',)


@admin.register(coreModel.Brand)
class BrandAdmin(SortableAdminMixin, admin.ModelAdmin):
    list_display = ('name', 'icon_tag')
    search_fields = ('name', )
    list_filter = ('status',)
    inlines = [InlineBrandOriginality]
    list_per_page = settings.LIST_PER_PAGE
    staff_fieldsets = (
        (None, {'fields': ('short_description', 'description', 'meta_title', 'meta_description')}),
    )

    def change_view(self, request, *args, **kwargs):
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                response = super(BrandAdmin, self).change_view(request, *args, **kwargs)
            finally:
                self.fieldsets = BrandAdmin.fieldsets
            return response
        else:
            return super(BrandAdmin, self).change_view(request, *args, **kwargs)


class InlineType(admin.TabularInline):
    model = coreModel.Type
    extra = 0
    list_display = ('name', 'volume', 'start_year', 'end_year')


class InlineGallery(admin.TabularInline):
    model = coreModel.CarGallery
    extra = 0

    def has_add_permission(self, request, obj=None):
        return True

    def has_change_permission(self, request, obj=None):
        return True

    def has_delete_permission(self, request, obj=None):
        return True


class InlineProductSynonym(admin.TabularInline):
    model = coreModel.ProductSynonym
    extra = 0
    list_display = ('name',)


@admin.register(coreModel.Product)
class ProductAdmin(admin.ModelAdmin):
    list_display = ('name', 'subcategory')
    search_fields = ('name', 'subcategory__category__name', 'subcategory__name')
    list_filter = ('subcategory__category',)
    inlines = [InlineProductSynonym]
    list_per_page = settings.LIST_PER_PAGE


@admin.register(coreModel.ProductBenefit)
class ProductBenefitAdmin(admin.ModelAdmin):
    list_display = ('product', 'benefit')
    search_fields = ('product__name', 'product')
    list_filter = ('product__subcategory__category__name', 'product__subcategory__name',)
    autocomplete_fields = ['product']
    list_per_page = settings.LIST_PER_PAGE


@admin.register(coreModel.ProductDiscount)
class ProductDiscountAdmin(admin.ModelAdmin):
    list_display = ('product', 'discount')
    search_fields = ('product__name', 'product')
    list_filter = ('product__subcategory__category__name', 'product__subcategory__name',)
    autocomplete_fields = ['product']
    list_per_page = settings.LIST_PER_PAGE


@admin.register(coreModel.CarSubcategory)
class CarSubcategoryAdmin(admin.ModelAdmin):
    change_list_template = 'admin/change_car_subcategory_list.html'
    staff_readonly_fields = ('car', 'subcategory')
    staff_fieldsets = (
        (None, {'fields': ('car', 'subcategory', 'description', 'meta_title', 'meta_description', )}),
    )

    def change_view(self, request, *args, **kwargs):
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                self.readonly_fields = self.staff_readonly_fields
                response = super(CarSubcategoryAdmin, self).change_view(request, *args, **kwargs)
            finally:
                self.fieldsets = CarSubcategoryAdmin.fieldsets
                self.readonly_fields = CarSubcategoryAdmin.readonly_fields
            return response
        else:
            return super(CarSubcategoryAdmin, self).change_view(request, *args, **kwargs)

    def changelist_view(self, request, extra_context=None):
        self.exclude = ()
        if request.method == 'POST':
            car_id = request.POST.get('car')
            subcategory_id = request.POST.get('subcategory')
            record = coreModel.CarSubcategory.objects.filter(car_id=car_id, subcategory_id=subcategory_id).first()
            extra_context = extra_context or {}
            extra_context['record'] = record
        extra_context = extra_context or {}
        extra_context['cars'] = coreModel.Car.objects.all()
        extra_context['subcategories'] = coreModel.Subcategory.objects.all()
        return super().changelist_view(request, extra_context=extra_context)


@admin.register(coreModel.CarProduct)
class CarProductAdmin(admin.ModelAdmin):
    change_list_template = 'admin/change_car_product_list.html'

    def changelist_view(self, request, extra_context=None):
        self.exclude = ()
        if request.method == 'POST':
            car_id = request.POST.get('car')
            product_id = request.POST.get('product')
            record = coreModel.CarProduct.objects.filter(car_id=car_id, product_id=product_id).first()
            extra_context = extra_context or {}
            extra_context['record'] = record
        extra_context = extra_context or {}
        extra_context['cars'] = coreModel.Car.objects.all()
        extra_context['products'] = coreModel.Product.objects.all()
        return super().changelist_view(request, extra_context=extra_context)


class CarForm(forms.ModelForm):
    subcategories = forms.ModelMultipleChoiceField(queryset=coreModel.Subcategory.objects.all(),
                                                   widget=FilteredSelectMultiple("زیردسته ها", is_stacked=False))
    products = forms.ModelMultipleChoiceField(queryset=coreModel.Product.objects.all(),
                                              widget=FilteredSelectMultiple("قطعات", is_stacked=False))

    class Meta:
        model = coreModel.Car
        fields = '__all__'


class InlineCarSynonym(admin.TabularInline):
    model = coreModel.CarSynonym
    extra = 0
    list_display = ('name',)


@admin.register(coreModel.Car)
class CarAdmin(SortableAdminMixin, admin.ModelAdmin):
    form = CarForm
    list_display = ('name', 'brand', 'image_tag')
    search_fields = ('name', 'brand__name')
    list_filter = ('brand',)
    inlines = [InlineType, InlineCarSynonym]
    list_per_page = settings.LIST_PER_PAGE
    staff_readonly_fields = ('brand', 'subcategories', 'products')
    staff_fieldsets = (
        (None, {'fields': ('brand', 'description', 'introduction', 'technical_info', 'car_test', 'meta_title',
                           'meta_description')}),
    )

    def get_inline_instances(self, request, obj=None):
        inline_instances = super().get_inline_instances(request, obj)
        if request.user.is_staff or request.user.is_superuser:
            inline_instances.append(InlineGallery(self.model, self.admin_site))
        return inline_instances

    def change_view(self, request, *args, **kwargs):
        if not request.user.is_superuser:
            try:
                self.fieldsets = self.staff_fieldsets
                self.readonly_fields = self.staff_readonly_fields
                response = super(CarAdmin, self).change_view(request, *args, **kwargs)
            finally:
                self.fieldsets = CarAdmin.fieldsets
                self.readonly_fields = CarAdmin.readonly_fields
            return response
        else:
            return super(CarAdmin, self).change_view(request, *args, **kwargs)
