from urllib import request

from django.contrib import admin
from django.core.files.storage import default_storage
from django import forms

from .models import Event, EventGalleryImage


class EventAdminForm(forms.ModelForm):
    image_file = forms.ImageField(required=False, help_text="Upload to set Image URL")
    banner_file = forms.ImageField(required=False, help_text="Upload to set Banner URL")

    class Meta:
        model = Event
        fields = "__all__"

    def save(self, commit=True):
        instance = super().save(commit=False)

        image_file = self.cleaned_data.get("image_file")
        if image_file:
            path = default_storage.save(f"events/{image_file.name}", image_file)
            instance.image_url = request.build_absolute_uri(default_storage.url(path))


        banner_file = self.cleaned_data.get("banner_file")
        if banner_file:
            path = default_storage.save(f"events/banners/{banner_file.name}", banner_file)
            instance.banner_url = request.build_absolute_uri(default_storage.url(path))


        if commit:
            instance.save()
        return instance


class EventGalleryImageAdminForm(forms.ModelForm):
    image_file = forms.ImageField(required=False, help_text="Upload to set Image URL")

    class Meta:
        model = EventGalleryImage
        fields = "__all__"

    def save(self, commit=True):
        instance = super().save(commit=False)

        image_file = self.cleaned_data.get("image_file")
        if image_file:
            path = default_storage.save(f"events/gallery/{image_file.name}", image_file)
            instance.image_url = request.build_absolute_uri(default_storage.url(path))


        if commit:
            instance.save()
        return instance


class EventGalleryInline(admin.TabularInline):
    model = EventGalleryImage
    form = EventGalleryImageAdminForm
    extra = 0


@admin.register(Event)
class EventAdmin(admin.ModelAdmin):
    form = EventAdminForm
    list_display = ["id", "title", "category", "status", "date", "location", "is_featured", "is_past"]
    list_filter = ["category", "status", "is_featured", "is_past", "date"]
    search_fields = ["title", "description", "location", "organizer"]
    prepopulated_fields = {"slug": ("title",)}
    inlines = [EventGalleryInline]


@admin.register(EventGalleryImage)
class EventGalleryImageAdmin(admin.ModelAdmin):
    form = EventGalleryImageAdminForm
    list_display = ["event", "caption", "created_at"]
    search_fields = ["event__title", "caption"]