from django.contrib import admin
from django.http import HttpResponse

from .models import (
    CabService,
    DashboardSettings,
    CompanyInformation,
    ContactEnquiry,
    Destination,
    GalleryImage,
    HolidayPackage,
    GoogleSettings,
    HomePageSettings,
    SEOSettings,
    CustomerReview,
    VisitorCounter,
    WebsiteLikeCounter,
    WebsiteSettings,
)


@admin.register(HolidayPackage)
class HolidayPackageAdmin(admin.ModelAdmin):
    list_display = ("title", "location", "duration", "price_from", "content_status", "is_featured", "is_active")
    list_filter = ("is_active", "is_featured", "location")
    search_fields = ("title", "location", "short_description", "seo_title", "seo_keywords")
    prepopulated_fields = {"slug": ("title",)}
    list_editable = ("is_featured", "is_active")
    ordering = ("display_order", "title")


@admin.register(CabService)
class CabServiceAdmin(admin.ModelAdmin):
    list_display = ("title", "vehicle_type", "price_from", "availability", "is_featured", "is_active", "display_order")
    list_filter = ("is_active", "is_featured")
    search_fields = ("title", "description", "vehicle_type", "availability", "seo_title")
    prepopulated_fields = {"slug": ("title",)}
    list_editable = ("is_featured", "is_active", "display_order")
    ordering = ("display_order", "title")


@admin.register(Destination)
class DestinationAdmin(admin.ModelAdmin):
    list_display = ("name", "is_featured", "is_active", "display_order")
    list_filter = ("is_active", "is_featured")
    search_fields = ("name", "description", "seo_title", "seo_keywords")
    prepopulated_fields = {"slug": ("name",)}
    list_editable = ("is_featured", "is_active", "display_order")
    ordering = ("display_order", "name")


@admin.register(GalleryImage)
class GalleryImageAdmin(admin.ModelAdmin):
    list_display = ("title", "is_active", "display_order", "uploaded_at")
    list_filter = ("is_active",)
    search_fields = ("title", "alt_text")
    list_editable = ("is_active", "display_order")
    readonly_fields = ("uploaded_at",)
    ordering = ("display_order", "-uploaded_at")


@admin.register(WebsiteSettings)
class WebsiteSettingsAdmin(admin.ModelAdmin):
    fieldsets = (
        (
            "Branding",
            {"fields": ("logo", "company_name", "footer_text", "business_hours")},
        ),
        (
            "Contact",
            {"fields": ("email", "phone_number", "whatsapp_number", "address")},
        ),
        (
            "Social Links",
            {"fields": ("facebook_url", "instagram_url", "youtube_url", "x_url")},
        ),
    )

    def has_add_permission(self, request):
        if WebsiteSettings.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(SEOSettings)
class SEOSettingsAdmin(admin.ModelAdmin):
    fieldsets = (
        (
            "SEO",
            {
                "fields": (
                    "meta_title",
                    "meta_description",
                    "meta_keywords",
                    "canonical_url",
                    "open_graph_image",
                    "robots_index",
                    "robots_follow",
                )
            },
        ),
    )

    def has_add_permission(self, request):
        if SEOSettings.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(GoogleSettings)
class GoogleSettingsAdmin(admin.ModelAdmin):
    fields = ("ga4_measurement_id", "gtm_container_id", "search_console_verification", "meta_pixel_id")

    def has_add_permission(self, request):
        if GoogleSettings.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(HomePageSettings)
class HomePageSettingsAdmin(admin.ModelAdmin):
    fieldsets = (
        (
            "Hero",
            {
                "fields": (
                    "hero_title",
                    "hero_subtitle",
                    "hero_button_text",
                    "hero_button_url",
                    "hero_images",
                )
            },
        ),
        (
            "Featured Content",
            {"fields": ("featured_destinations", "featured_packages")},
        ),
    )
    filter_horizontal = ("featured_destinations", "featured_packages")

    def has_add_permission(self, request):
        if HomePageSettings.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(DashboardSettings)
class DashboardSettingsAdmin(admin.ModelAdmin):
    fields = ("dashboard_title", "dashboard_subtitle")

    def has_add_permission(self, request):
        if DashboardSettings.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(VisitorCounter)
class VisitorCounterAdmin(admin.ModelAdmin):
    list_display = ("total_count", "updated_at")
    readonly_fields = ("updated_at",)

    def has_add_permission(self, request):
        if VisitorCounter.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(WebsiteLikeCounter)
class WebsiteLikeCounterAdmin(admin.ModelAdmin):
    list_display = ("total_likes", "updated_at")
    readonly_fields = ("updated_at",)

    def has_add_permission(self, request):
        if WebsiteLikeCounter.objects.exists():
            return False
        return super().has_add_permission(request)


@admin.register(CustomerReview)
class CustomerReviewAdmin(admin.ModelAdmin):
    list_display = ("name", "city", "rating", "likes", "status", "created_at")
    list_filter = ("status", "rating", "created_at")
    search_fields = ("name", "city", "email", "review")
    list_editable = ("status",)
    readonly_fields = ("created_at",)
    ordering = ("-created_at",)


@admin.register(ContactEnquiry)
class ContactEnquiryAdmin(admin.ModelAdmin):
    list_display = (
        "name",
        "phone",
        "email",
        "destination",
        "date_of_travel",
        "adults",
        "number_of_nights",
        "hotel_category",
        "status",
        "created_at",
    )
    list_filter = ("status", "destination", "date_of_travel", "hotel_category", "created_at")
    search_fields = ("name", "destination", "phone", "email", "city", "message", "special_request")
    list_editable = ("status",)
    readonly_fields = ("created_at",)
    ordering = ("-created_at",)
    actions = ("export_selected_to_csv",)

    @admin.action(description="Export selected enquiries to CSV")
    def export_selected_to_csv(self, request, queryset):
        response = HttpResponse(content_type="text/csv")
        response["Content-Disposition"] = 'attachment; filename="contact_enquiries.csv"'

        lines = [
            "Name,Mobile,Email,City,Destination,Date Of Travel,Adults,Children,Children Ages,Number Of Nights,Hotel Category,Special Request,Status,Submitted At",
        ]
        for enquiry in queryset.order_by("-created_at"):
            line = [
                enquiry.name,
                enquiry.phone,
                enquiry.email,
                enquiry.city,
                enquiry.destination,
                str(enquiry.date_of_travel or ""),
                str(enquiry.adults or ""),
                str(enquiry.children or ""),
                enquiry.children_ages,
                str(enquiry.number_of_nights or ""),
                enquiry.get_hotel_category_display() if enquiry.hotel_category else "",
                enquiry.special_request.replace("\n", " ").replace(",", " "),
                enquiry.get_status_display(),
                enquiry.created_at.strftime("%Y-%m-%d %H:%M:%S"),
            ]
            escaped = [f'"{value}"' for value in line]
            lines.append(",".join(escaped))

        response.write("\n".join(lines))
        return response


@admin.register(CompanyInformation)
class CompanyInformationAdmin(admin.ModelAdmin):
    fieldsets = (
        (
            "Company",
            {
                "fields": (
                    "company_name",
                    "tagline",
                    "introduction",
                    "story",
                    "mission",
                    "vision",
                    "why_choose_text",
                )
            },
        ),
        (
            "Contact",
            {
                "fields": (
                    "phone_number",
                    "whatsapp_number",
                    "email",
                    "address",
                    "working_hours",
                    "google_map_embed_url",
                )
            },
        ),
        (
            "Social Links",
            {"fields": ("facebook_url", "instagram_url", "youtube_url", "x_url")},
        ),
    )

    def has_add_permission(self, request):
        if CompanyInformation.objects.exists():
            return False
        return super().has_add_permission(request)


admin.site.site_header = "Aarya Holidays Admin"
admin.site.site_title = "Aarya Holidays Admin"
admin.site.index_title = "Manage Website Content"
