from django.contrib import admin
from . import models
from django.utils.html import format_html, urlencode
from django.urls import reverse
from decimal import Decimal
# Register your models here.


@admin.register(models.Currency)
class CurrencyAdmin(admin.ModelAdmin):
    list_display = ['name', 'code', 'symbol']


@admin.register(models.Address)
class AddressAdmin(admin.ModelAdmin):
    list_display = ['city', 'country']


class SenderDocumentsInline(admin.TabularInline):
    model = models.SenderDocuments
    readonly_fields = ['thumbnail']
    extra = 0

    def thumbnail(self, instance):
        if instance.image.name != '':
            return format_html(
                f'<img src="{instance.image.url}" class="thumbnail" style="max-width: 100px; max-height: 100px;" />'
            )
        return ''


@admin.register(models.Sender)
class SenderAdmin(admin.ModelAdmin):
    list_display = ['name', 'last_name', 'mobile', 'print_balance']

    inlines = [SenderDocumentsInline]
    search_fields = ['name', 'last_name', 'mobile']

    def print_balance(self, obj):
        url = reverse('cargo:print_sender_balance',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_balance.short_description = 'Balance'


class ReceiverDocumentsInline(admin.TabularInline):
    model = models.ReceiverDocuments
    readonly_fields = ['thumbnail']
    extra = 0

    def thumbnail(self, instance):
        if instance.image.name != '':
            return format_html(
                f'<img src="{instance.image.url}" class="thumbnail" style="max-width: 100px; max-height: 100px;" />'
            )
        return ''


@admin.register(models.Receiver)
class ReceiverAdmin(admin.ModelAdmin):
    list_display = ['name', 'last_name', 'mobile']

    inlines = [ReceiverDocumentsInline]
    search_fields = ['name', 'last_name', 'mobile']


@admin.register(models.MeasurementUnit)
class MeasurementUnitAdmin(admin.ModelAdmin):
    list_display = ['title', 'details']
    search_fields = ['title']


@admin.register(models.Item)
class ItemAdmin(admin.ModelAdmin):
    list_display = ['title', 'details']
    search_fields = ['title']


@admin.register(models.CargoBy)
class CargoByAdmin(admin.ModelAdmin):
    list_display = ['title', 'incharge', 'phone', 'print_balance']
    search_fields = ['title']

    def print_balance(self, obj):
        url = reverse('cargo:cargo_balance',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_balance.short_description = 'Balance'


class InvoiceItemsInline(admin.TabularInline):
    model = models.InvoiceItems
    extra = 0
    autocomplete_fields = ['item']
    fields = (
        'item', 'quantity', 'unit_price',
        'handling_charges',
    )
    classes = ('wide',)

    def get_readonly_fields(self, request, obj=None):
        readonly_fields = super().get_readonly_fields(request, obj)
        if not (request.user.is_superuser or request.user.groups.filter(name='General Admin').exists()):
            # If the user is not a superuser or not in the 'Special Users' group,
            # make these fields read-only
            readonly_fields = ('deliver_charges', 'expo_percentage')
        return readonly_fields


@admin.register(models.Invoice)
class InvoiceAdmin(admin.ModelAdmin):
    list_display = ['id', 'sender',
                    'receiver', 'track_number', 'calculate_total_amount', 'print_delivery_details', 'print_sale_bill']
    inlines = [InvoiceItemsInline]
    list_per_page = 15
    autocomplete_fields = ['sender', 'receiver', 'by_cargo']
    search_fields = ['=id', 'track_number']
    list_filter = ('by_cargo', 'created_at')
    readonly_fields = ['remain_amount']
    fieldsets = (
        ('SRC Information', {
            'fields': (('sender', 'receiver'), ('by_cargo', 'destination'))
        }),
        ('Item Details', {
            'fields': ('item_value', 'item_description')
        }),
        ('Payment Details', {
            'fields': ('amount_paid', 'remain_amount'),
            # Add 'wide' class to make fields appear in one row
            'classes': ('wide',),
        }),
        ('Tracking and Remarks', {
            'fields': ('track_number', 'remarks')
        }),

    )

    def calculate_total_amount(self, obj):
        total_amount = sum(
            (item.quantity * item.unit_price) + item.handling_charges
            for item in obj.invoiceitems_set.all()
        )
        # Round the result to two decimal places
        return round(total_amount, 2)

    calculate_total_amount.short_description = 'Total Amount'

    def print_sale_bill(self, obj):
        url = reverse('cargo:print_sale_bill', kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_sale_bill.short_description = 'Bill'

    def print_delivery_details(self, obj):
        url = reverse('cargo:print_delivery_details', kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_delivery_details.short_description = 'Delivery Details'

    def save_model(self, request, obj, form, change):
        if not obj.pk:
            obj.created_by = request.user
        else:
            obj.updated_by = request.user
        super().save_model(request, obj, form, change)


@admin.register(models.SenderBalance)
class SenderBalanceAdmin(admin.ModelAdmin):
    list_display = ('tx_date', 'sender', 'tx_number', 'description',
                    'previous_balance', 'amount_in', 'amount_out', 'current_balance')
    list_filter = ('sender',)
    search_fields = ('sender__name', 'tx_number')
    ordering = ('-tx_date',)
    readonly_fields = ('current_balance',)
    fieldsets = (
        ('Transaction Details', {
            'fields': ('tx_date', 'sender', 'tx_number', 'description')
        }),
        ('Transaction Amounts', {
            'fields': ('previous_balance', 'amount_in', 'amount_out', 'current_balance')
        }),
        ('Remarks', {
            'fields': ('remarks',)
        })
    )


@admin.register(models.CargoByBalance)
class CargoByBalanceAdmin(admin.ModelAdmin):
    list_display = ('tx_date', 'cargo_by', 'tx_number', 'description', 'previous_balance',
                    'amount_in', 'amount_out', 'current_balance')
    list_filter = ('cargo_by',)
    search_fields = ('cargo_by__title', 'tx_number')
    ordering = ('-tx_date',)
    readonly_fields = ('current_balance',)
    fieldsets = (
        ('Transaction Details', {
            'fields': ('tx_date', 'cargo_by', 'tx_number', 'description')
        }),
        ('Transaction Amounts', {
            'fields': ('previous_balance', 'amount_in', 'amount_out', 'current_balance')
        }),
        ('Remarks', {
            'fields': ('remarks',)
        })
    )


@admin.register(models.PaymentToExpo)
class PaymentToExpoAdmin(admin.ModelAdmin):
    list_display = ('expo', 'amount', 'remain_amount',
                    'remarks', 'created_at', 'print_sale_bill')
    list_filter = ('expo', 'created_at')
    fields = ['expo', 'amount', 'remarks']
    search_fields = ('expo__name', 'remarks')
    readonly_fields = ('remain_amount',)
    autocomplete_fields = ['expo']
    ordering = ('-created_at',)

    def print_sale_bill(self, obj):
        url = reverse('cargo:print_payment_to_expo_voucher',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_sale_bill.short_description = 'Bill'

    def save_model(self, request, obj, form, change):
        if not obj.pk:
            obj.created_by = request.user
        else:
            obj.updated_by = request.user
        super().save_model(request, obj, form, change)


@admin.register(models.ReceivePaymentFromSender)
class ReceivePaymentFromSenderAdmin(admin.ModelAdmin):
    list_display = ('sender', 'amount', 'remain_amount',
                    'remarks', 'created_at', 'print_sale_bill')
    list_filter = ('sender', 'created_at')
    fields = ['sender', 'amount', 'remarks']
    search_fields = ('sender__name', 'remarks')
    readonly_fields = ('remain_amount',)
    autocomplete_fields = ['sender']
    ordering = ('-created_at',)

    def print_sale_bill(self, obj):
        url = reverse('cargo:print_received_payment_from_sender_voucher',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_sale_bill.short_description = 'Bill'

    def save_model(self, request, obj, form, change):
        if not obj.pk:
            obj.created_by = request.user
        else:
            obj.updated_by = request.user
        super().save_model(request, obj, form, change)


@admin.register(models.ExpenseCategory)
class ExpenseCategoryAdmin(admin.ModelAdmin):
    list_display = ['title', 'remarks']
    search_fields = ['title',]


@admin.register(models.AddExpense)
class AddExpenseAdmin(admin.ModelAdmin):
    list_display = ['expense_category', 'paid_by', 'paid_to',
                    'amount', 'remarks', 'date', 'print_voucher']
    list_per_page = 10
    fields = ['expense_category', 'paid_by', 'paid_to',
              'amount', 'currency', 'description', 'date', 'remarks']
    list_filter = ['expense_category']
    autocomplete_fields = ['expense_category',]

    def print_voucher(self, obj):
        url = reverse('cargo:print_expense_voucher', kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_voucher.short_description = 'Voucher'
