from django.contrib import admin
from django.urls import path, reverse
from django.utils.html import format_html
from .models import Tenant
from paymentlog.models import PaymentLog
from .forms import TenantForm, UpdateTenantForm
from .views import PayBillsView, CheckoutView, DetailsView, ShiftRoomView

@admin.register(Tenant)
class TenantAdmin(admin.ModelAdmin):
    form = TenantForm
    list_display = ('name_with_avatar', 'email', 'phone_number', 'custom_room', 'check_in', 'check_out_with_action', 'custom_actions')


    def custom_room(self, obj):
        if obj.current_room:
            return format_html(f"""
                <span>{obj.current_room.room}</span>
                """
            )
        else:
            return format_html("""
                <span>No Room</span>
                """
            )

    custom_room.short_description = "Room" # type: ignore

    def check_out_with_action(self, obj):
        if obj.check_out is None:
            url = reverse('admin:check_out', args=[obj.pk])
            return format_html(
                '<a href="{}" class="checkout-btn button">Check Out</button>', url
            )
        else:
            return format_html(f"""
                <span>{obj.check_out}</span>
                """
            )

    check_out_with_action.short_description = "Check Out" # type: ignore

    def name_with_avatar(self, obj):
        avatar_url = obj.avatar.url if obj.avatar else None
        if avatar_url:
            return format_html(f"""
                <span class='avatar-container'>
                    <img src="{avatar_url}" alt="Avatar for {obj.name}" />
                </span>
                <span>{obj.name}</span>
            """)
        else:
            return format_html(f"""
                <span class='avatar-container'>
                    <span>{obj.name[0].upper()}</span>
                </span>
                <span>{obj.name}</span>
            """)

    name_with_avatar.short_description = "Name" # type: ignore
    def get_form(self, request, obj=None, change=False, **kwargs):
        """Use different forms based on whether we're adding or editing"""
        if obj is None:
            return TenantForm
        return UpdateTenantForm

    def get_urls(self):
        urls = super().get_urls()
        custom_urls = [
            path('tenant/<int:tenant_id>/pay-bill/', self.admin_site.admin_view(PayBillsView.as_view()), name="tenant_pay_bills"),
            path('tenant/<int:tenant_id>/details/', self.admin_site.admin_view(DetailsView.as_view()), name="tenant_details"),
            path('tenant/<int:tenant_id>/shift-room/', self.admin_site.admin_view(ShiftRoomView.as_view()), name="tenant_shift_room"),
            path('tenant/<int:tenant_id>/check-out/', self.admin_site.admin_view(CheckoutView.as_view()), name="check_out"),
        ]
        return custom_urls + urls

    def custom_actions(self, obj):
        pending_payments = PaymentLog.objects.filter(tenant_id=obj.id, status="pending", log_type="rent").order_by("amount") if obj.check_out is None else PaymentLog.objects.filter(tenant_id=obj.id, status="pending").order_by("amount") # type: ignore

        html = ""

        view_url = reverse("admin:tenant_details", args=[obj.pk])
        html += f'<a class="button" href="{view_url}">View</a>'

        if pending_payments.exists():
            pay_url = reverse("admin:tenant_pay_bills", args=[obj.pk])
            html += f'<a class="button" href="{pay_url}">Pay Bills</a>'

        return format_html("<div style='display:flex;align-items:center;gap:10px;'>{}</div>", html)


    custom_actions.short_description = "Actions"  # type: ignore

    class Media:
        js = ('tenant/js/change_room.js', 'utils/js/state_city.js', 'tenant/js/handle_meal.js',)
        css = {
            'all': ("utils/css/custom_admin.css",)
        }
