from django.contrib import admin
from django.utils.html import format_html
from .models import Article, ArticleImage, Innovation, InnovationImage

admin.site.site_header = "CMS CHAMPS CENTER"
admin.site.site_title = "My CMS CHAMPS CENTER"
admin.site.index_title = "Welcome to CHAMPS CENTER"

class ArticleImageInline(admin.TabularInline):
    model = ArticleImage
    fields = ['show_preview', 'image', 'caption']
    readonly_fields = ['show_preview']
    can_delete = True
    extra = 0
    min_num = 0
    max_num = None

    class Media:
        js = ('js/admin_inline_multiple_upload.js',)
        css = {
            'all': ('css/inline_preview.css',)
        }

    def get_extra(self, request, obj=None, **kwargs):
        return 0

    def show_preview(self, obj):
        if obj.image:
            return format_html(
                '<div class="thumbnail-hover">'
                '<img src="{}" style="max-height:100px;" />'
                '</div>',
                obj.image.url
            )
        return "No Image"
    show_preview.short_description = "Preview"

@admin.register(Article)
class ArticleAdmin(admin.ModelAdmin):
    list_display = ('title', 'category', 'show_cover')
    inlines = [ArticleImageInline]

    def show_cover(self, obj):
        if obj.cover_image:
            return format_html('<img src="{}" width="100" />', obj.cover_image.url)
        return 'No Image'
    show_cover.short_description = 'Cover Preview'

    def get_form(self, request, obj=None, **kwargs):
        form_class = super().get_form(request, obj, **kwargs)
        def force_multipart(*args, **kw):
            return True
        form_class.is_multipart = force_multipart
        return form_class

    def save_formset(self, request, form, formset, change):
        if formset.model == ArticleImage:
            for inline_form in formset.forms:
                files_key = inline_form.add_prefix('image')
                multiple_files = request.FILES.getlist(files_key, [])

                if multiple_files and len(multiple_files) > 1:
                    inline_instance = inline_form.save(commit=False)
                    article_obj = inline_instance.article

                    for f in multiple_files:
                        ArticleImage.objects.create(
                            article=article_obj,
                            image=f,
                            caption=inline_form.cleaned_data.get('caption', '')
                        )

                    inline_form.cleaned_data['image'] = None
                    inline_form.instance.image = None
                    inline_form.cleaned_data['DELETE'] = True
                else:
                    inline_form.save()

            super().save_formset(request, form, formset, change)
        else:
            super().save_formset(request, form, formset, change)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            if request.user.groups.filter(name='admin-cssc').exists():
                obj.category = 'cssc'
            elif request.user.groups.filter(name='admin-sctc').exists():
                obj.category = 'sctc'
        super().save_model(request, obj, form, change)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        if request.user.groups.filter(name='admin-cssc').exists():
            return qs.filter(category='cssc')
        if request.user.groups.filter(name='admin-sctc').exists():
            return qs.filter(category='sctc')
        return qs.none()

    def get_exclude(self, request, obj=None):
        if not request.user.is_superuser:
            return ['category']
        return []

    def has_change_permission(self, request, obj=None):
        if request.user.is_superuser:
            return True
        if obj is not None:
            if request.user.groups.filter(name='admin-cssc').exists() and obj.category == 'cssc':
                return True
            if request.user.groups.filter(name='admin-sctc').exists() and obj.category == 'sctc':
                return True
            return False
        return True

    def has_delete_permission(self, request, obj=None):
        if request.user.is_superuser:
            return True
        if obj is not None:
            if request.user.groups.filter(name='admin-cssc').exists() and obj.category == 'cssc':
                return True
            if request.user.groups.filter(name='admin-sctc').exists() and obj.category == 'sctc':
                return True
            return False
        return True



# ------------------------------------------------------------------
# เพิ่ม Inline + Admin สำหรับ Innovation
# ------------------------------------------------------------------

class InnovationImageInline(admin.TabularInline):
    model = InnovationImage
    fields = ['show_preview', 'image', 'caption']
    readonly_fields = ['show_preview']
    extra = 0
    can_delete = True

    class Media:
        js = ('js/admin_inline_multiple_upload.js',)
        css = {
            'all': ('css/inline_preview.css',)
        }

    def show_preview(self, obj):
        if obj.image:
            return format_html(
                '<div class="thumbnail-hover">'
                '<img src="{}" style="max-height:100px;" />'
                '</div>',
                obj.image.url
            )
        return "No Image"
    show_preview.short_description = "Preview"

@admin.register(Innovation)
class InnovationAdmin(admin.ModelAdmin):
    list_display = ('title', 'category', 'show_cover')
    inlines = [InnovationImageInline]

    def show_cover(self, obj):
        if obj.cover_image:
            return format_html('<img src="{}" width="100" />', obj.cover_image.url)
        return 'No Image'
    show_cover.short_description = 'Cover Preview'

    def get_form(self, request, obj=None, **kwargs):
        form_class = super().get_form(request, obj, **kwargs)
        def force_multipart(*args, **kw):
            return True
        form_class.is_multipart = force_multipart
        return form_class

    def save_formset(self, request, form, formset, change):
        if formset.model == InnovationImage:
            for inline_form in formset.forms:
                files_key = inline_form.add_prefix('image')
                multiple_files = request.FILES.getlist(files_key, [])

                if multiple_files and len(multiple_files) > 1:
                    inline_instance = inline_form.save(commit=False)
                    innovation_obj = inline_instance.innovation

                    for f in multiple_files:
                        InnovationImage.objects.create(
                            innovation=innovation_obj,
                            image=f,
                            caption=inline_form.cleaned_data.get('caption', '')
                        )

                    inline_form.cleaned_data['image'] = None
                    inline_form.instance.image = None
                    inline_form.cleaned_data['DELETE'] = True
                else:
                    inline_form.save()

            super().save_formset(request, form, formset, change)
        else:
            super().save_formset(request, form, formset, change)

    def save_model(self, request, obj, form, change):
        if not request.user.is_superuser:
            if request.user.groups.filter(name='admin-cssc').exists():
                obj.category = 'cssc'
            elif request.user.groups.filter(name='admin-sctc').exists():
                obj.category = 'sctc'
        super().save_model(request, obj, form, change)

    def get_queryset(self, request):
        qs = super().get_queryset(request)
        if request.user.is_superuser:
            return qs
        if request.user.groups.filter(name='admin-cssc').exists():
            return qs.filter(category='cssc')
        if request.user.groups.filter(name='admin-sctc').exists():
            return qs.filter(category='sctc')
        return qs.none()

    def get_exclude(self, request, obj=None):
        if not request.user.is_superuser:
            return ['category']
        return []

    def has_change_permission(self, request, obj=None):
        if request.user.is_superuser:
            return True
        if obj is not None:
            if request.user.groups.filter(name='admin-cssc').exists() and obj.category == 'cssc':
                return True
            if request.user.groups.filter(name='admin-sctc').exists() and obj.category == 'sctc':
                return True
            return False
        return True

    def has_delete_permission(self, request, obj=None):
        if request.user.is_superuser:
            return True
        if obj is not None:
            if request.user.groups.filter(name='admin-cssc').exists() and obj.category == 'cssc':
                return True
            if request.user.groups.filter(name='admin-sctc').exists() and obj.category == 'sctc':
                return True
            return False
        return True
