from django.contrib import admin
from django.urls import reverse
from django.utils.html import format_html, urlencode
from humanresource.models import *
from inventory.models import *
from .models import *


@admin.register(ExpenseCategory)
class ExpenseCategoryAdmin(admin.ModelAdmin):
    list_display = ['title', 'remarks']
    search_fields = ['title',]


@admin.register(AddExpense)
class AddExpenseAdmin(admin.ModelAdmin):
    list_display = ['expense_category', 'approved_by',
                    'spent_by', 'amount', 'remarks', 'date', 'print_voucher']
    list_per_page = 10
    fields = ['expense_category', 'spent_by', 'approved_by',
              'amount', 'from_account', 'currency', 'description', 'date', 'remarks']
    list_filter = ['expense_category']
    autocomplete_fields = ['expense_category',]

    def print_voucher(self, obj):
        url = reverse('finance:print_expense_voucher', kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_voucher.short_description = 'Voucher'


@admin.register(ShareHolderWithdrawal)
class ShareHolderWithdrawalAdmin(admin.ModelAdmin):
    list_display = ('holder', 'amount', 'date', 'created_by', 'print_voucher')
    list_filter = ('holder', 'created_by')
    autocomplete_fields = ['holder']
    fields = ['holder', 'currency', 'amount', 'date', 'remarks']
    search_fields = ('holder__name', 'remarks')

    def print_voucher(self, obj):
        url = reverse('finance:print_owner_withdrawal_voucher',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_voucher.short_description = 'Voucher'

    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(PaymentToDoctor)
class PaymentToDoctorAdmin(admin.ModelAdmin):
    list_display = ['placed_at', 'doctor',
                    'amount_paid', 'remarks', 'created_by', 'print_voucher']
    fields = ['placed_at', 'doctor', 'from_account', 'amount_paid', 'remarks']
    autocomplete_fields = ['doctor']

    def print_voucher(self, obj):
        url = reverse('finance:print_payment_voucher_to_doctor',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_voucher.short_description = 'Voucher'

    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(AccountPayableReceivable)
class AccountPayableReceivableAdmin(admin.ModelAdmin):
    list_display = ('date', 'account_type', 'tx_number', 'description',
                    'amount_in', 'amount_out', 'currency', 'remarks')
    list_filter = ('account_type', 'currency')
    search_fields = ('tx_number', 'description', 'remarks')
    ordering = ('-date',)


@admin.register(CashAccount)
class CashAccountAdmin(admin.ModelAdmin):
    list_display = ('date', 'account_type', 'tx_number', 'description',
                    'previous_balance', 'amount_in', 'amount_out', 'current_balance', 'currency', 'remarks')
    list_filter = ('account_type', 'currency')
    search_fields = ('tx_number', 'description', 'remarks')
    ordering = ('-date',)


@admin.register(ShareHolderDeposit)
class ShareHolderDepositAdmin(admin.ModelAdmin):
    list_display = ('share_holder', 'date', 'tx_number', 'currency',
                    'amount_in', 'amount_out', 'print_voucher')
    list_filter = ('share_holder', 'currency')
    search_fields = ('share_holder__name', 'date')
    readonly_fields = ['amount_out']
    fields = ['share_holder', 'date', 'tx_number',
              'currency', 'amount_in', 'remarks']
    ordering = ('-date',)
    autocomplete_fields = ['share_holder']

    def print_voucher(self, obj):
        url = reverse('finance:print_owner_deposit_voucher',
                      kwargs={'pk': obj.id})
        return format_html('<a href="{}">Print</a>', url)

    print_voucher.short_description = 'Voucher'

    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)
