from django.contrib import admin
from django.forms import ModelChoiceField, ModelForm

from banking.models.account import Account
from banking.models.transaction import Transaction

from django.contrib.auth.admin import UserAdmin as BaseUserAdmin
from django.contrib.auth.forms import UserCreationForm as BaseUserCreationForm
#from django.contrib.auth.models import User
from django.contrib import admin

class CustomAccountChoiceField(ModelChoiceField):
    def label_from_instance(self, obj):
        return f"IBAN: {obj.iban}"


class CustomTransactionAdminForm(ModelForm):
    payer = CustomAccountChoiceField(queryset=Account.objects.all())
    beneficiary = CustomAccountChoiceField(queryset=Account.objects.all())

    class Meta:
        model = Transaction
        fields = "__all__"


@admin.register(Transaction)
class BankingTransaction(admin.ModelAdmin):
    date_hierarchy = "created"
    list_display = ("amount", "created", "payer")
    list_display_links = ("amount",)
    list_filter = ("is_processed",)
    readonly_fields = ("created", "is_processed")
    form = CustomTransactionAdminForm


@admin.register(Account)
class BankingAccount(admin.ModelAdmin):
    list_display = ("user", "account_iban", "balance")
    list_filter = ("user",)
    list_display_links = ("user",)
    prepopulated_fields = {"slug": ("user", "iban")}

    @admin.display(description="Account iban")
    def account_iban(self, obj):
        return obj.iban


class UserCreationForm(BaseUserCreationForm):
    class Meta(BaseUserCreationForm.Meta):
        fields = ('username',  'first_name', 'last_name', 'email')

class UserAdmin(BaseUserAdmin):
    add_form = UserCreationForm
    add_fieldsets = (
        (None, {
            'fields': ('username', 'first_name', 'last_name', 'email', 'password1', 'password2'),
        }),
    )

#admin.site.unregister(User)
#admin.site.register(User, UserAdmin)