from django import contrib
from django.utils.translation import ugettext_lazy as _

from one import models
import school.models


def owner_person(obj):
    p = obj.owner
    return "%s %s (%s)" % (p.last_name, p.first_name, p.username)
owner_person.short_description = _('owner')


class PersonInline(contrib.admin.StackedInline):
    model = school.models.Person
    max_num = 1
    can_delete = False


class SshKeyInline(contrib.admin.TabularInline):
    model = models.SshKey
    extra = 2


class DetailsInline(contrib.admin.StackedInline):
    model = models.UserCloudDetails
    max_num = 1
    can_delete = False


class MyUserAdmin(contrib.auth.admin.UserAdmin):
    list_display = ('username', 'full_name', 'email',
                    'date_joined', 'instance_count', 'course_groups')
    list_filter = ('is_superuser', 'is_active',
                   'groups', 'person__course_groups', )

    def __init__(self, *args, **kwargs):
        super(MyUserAdmin, self).__init__(*args, **kwargs)
        add = [PersonInline, SshKeyInline, DetailsInline, ]
        try:
            inlines = self.inlines
        except NameError:
            inlines = list()
        self.inlines = inlines + add

    def instance_count(self, obj):
        return _("%(sum)d (%(active)d active)") % {
            'sum': obj.instance_set.count(),
            'active': obj.instance_set.filter(state='ACTIVE').count(), }

    def course_groups(self, obj):
        try:
            return ", ".join(obj.person_set.all()[0].course_groups.all())
        except:
            return None

    def full_name(self, obj):
        return u"%s %s" % (obj.last_name, obj.first_name)
    full_name.admin_order_field = 'last_name'

    ordering = ["-date_joined"]


contrib.admin.site.unregister(contrib.auth.models.User)
contrib.admin.site.register(contrib.auth.models.User, MyUserAdmin)


def update_state(modeladmin, request, queryset):
    for i in queryset.all():
        i.update_state()
update_state.short_description = _('Update status')


def submit_vm(modeladmin, request, queryset):
    for i in queryset.all():
        i.submit(request.user)
        i.update_state()
submit_vm.short_description = _('Submit VM')


def delete_vm(modeladmin, request, queryset):
    for i in queryset.exclude(state='DONE').all():
        i.one_delete()
delete_vm.short_description = _('Delete VM')


def suspend_vm(modeladmin, request, queryset):
    for i in queryset.filter(state='ACTIVE').all():
        i.stop()
suspend_vm.short_description = _('Suspend VM')


def resume_vm(modeladmin, request, queryset):
    for i in queryset.filter(state__in=('STOPPED', 'SUSPENDED')).all():
        i.resume()
resume_vm.short_description = _('Resume VM')


class TemplateAdmin(contrib.admin.ModelAdmin):
    model = models.Template
    list_display = ('name', 'state', owner_person, 'system', 'public')
    list_filter = ('owner', 'public')


class InstanceAdmin(contrib.admin.ModelAdmin):
    model = models.Instance
    actions = [update_state, submit_vm, delete_vm, suspend_vm, resume_vm]
    list_display = ('id', 'name', owner_person, 'state')
    readonly_fields = ('ip', 'active_since', 'pw', 'template')
    list_filter = ('owner', 'template', 'state')

    def queryset(self, request):
        return super(InstanceAdmin, self).queryset(request)


class DiskAdmin(contrib.admin.ModelAdmin):
    model = models.Disk
    list_display = ('name', 'used_by')

    def used_by(self, obj):
        try:
            return ", ".join(obj.template_set.all())
        except:
            return None
    used_by.verbose_name = _('used by')


class NetworkAdmin(contrib.admin.ModelAdmin):
    model = models.Network
    list_display = ('name', 'nat', 'public', 'get_vlan')


class ShareAdmin(contrib.admin.ModelAdmin):
    model = models.Network
    list_filter = ('group', 'template', )
    list_display = ('name', owner_person, 'template', 'group', )

contrib.admin.site.register(models.Template, TemplateAdmin)
contrib.admin.site.register(models.Instance, InstanceAdmin)
contrib.admin.site.register(models.Network, NetworkAdmin)
contrib.admin.site.register(models.Disk, DiskAdmin)
contrib.admin.site.register(models.Share, ShareAdmin)
contrib.admin.site.register(models.InstanceType)
