from django.contrib import admin
from django.contrib.admin import widgets as adminwidgets
from django.forms import widgets
import django.forms as forms
from models import Server, Config, Domain, Account, Address

class AccountForm(forms.ModelForm):
    class Meta:
        model = Account
    def __init__(self, *args, **kwargs):
        super(AccountForm, self).__init__(*args, **kwargs)
        #self.fields["primary_address"].queryset = \
        #        Address.objects.filter(domain__in=self.instance.config.domain_set.all())



class ServerOptions(admin.ModelAdmin):
    list_display = ('__unicode__',
            'smtp', 'smtp_account_count',
            'xmpp', 'xmpp_account_count',
            'imap', 'imap_account_count',
            'pop3', 'pop3_account_count') 
    list_filter = ('name', 'smtp', 'xmpp', 'imap', 'pop3')
    ordering = ('name',)

class ConfigOptions(admin.ModelAdmin):
    list_display = ('__unicode__', 'smtp_server', 'xmpp_server', 'imap_server', 'pop3_server') 
    ordering = ('name',)

class AddressOptions(admin.ModelAdmin):
    list_display = ('__unicode__', 'enabled', 'has_account','uid', 'gid', 'recipient_count', ) 
    list_filter = ('domain', 'enabled')
    ordering = ('domain', 'address')
    search_fields = ('address', 'domain')

class AddressInline(admin.TabularInline):
    # including custom js doesn't work yet
    #media = forms.Media(js = ('SelectFilterSingle.js',))
    model = Address
    #filter_horizontal = ('accounts',)
    def formfield_for_dbfield(self, db_field, **kwargs):
        field = super(AddressInline, self).formfield_for_dbfield(db_field,
                **kwargs)
        if db_field.name == "accounts":
            field.widget.attrs.update({'size': 5})
    #        accounts = [[x.pk, x.name]
    #                for x in Account.objects.all()]
    #        field.widget = widgets.Select({'size': 5}, accounts)
    #        field.widget.render = \
    #                adminwidgets.RelatedFieldWidgetWrapper(field.widget.render,
    #                        db_field.rel, self.admin_site)
    #        # make_searchable doesn't work yet - needs more javascript
    #        #make_searchable(field.widget, db_field.name)
        if db_field.name == "recipients":
            field.widget.attrs.update({'cols': 50, 'rows': 3})
        return field

class DomainOptions(admin.ModelAdmin):
    list_display = ('name', 'transport', 'address_count', 'config')
    list_filter = ('transport', 'config') # 'default_user')
    inlines = [AddressInline]
    save_on_top = True


class AccountOptions(admin.ModelAdmin):
    form = AccountForm
    list_display = ('__unicode__', 'enabled', 'smtp', 'imap', 'pop3',
            'xmpp', 'quota')
    list_filter = ('enabled', 'smtp', 'imap', 'pop3', 'xmpp',
            'config', 'created_date') 
    search_fields = ['name', 'real_name']
    fieldsets = (
        (None, {
            'fields': (('name', 'enabled'),
                'password', 'password_clear', 'real_name', 'primary_address', 'alternative_mail')
            }),
        ('Permissions', {
            'fields': ('smtp', 'imap', 'pop3', 'xmpp', 'prefix', 'config', 'admins'),
            }),
        (None, {
        'fields': ('quota',)
    }))
    save_on_top = True


admin.site.register(Server, ServerOptions)
admin.site.register(Config, ConfigOptions)
admin.site.register(Domain, DomainOptions)
admin.site.register(Account, AccountOptions)
admin.site.register(Address, AddressOptions)

