# coding: utf-8

from django.contrib import admin
from nested_admin import (NestedModelAdmin, NestedStackedInline,
                          NestedTabularInline)

from .models import (BayesianNetwork, BayesianNetworkNode,
                     BayesianNetworkNodeColumn, BayesianNetworkEdge)


class BayesianNetworkNodeColumnInline(NestedTabularInline):
    model = BayesianNetworkNodeColumn
    sortable_field_name = "position"
    fields = ["ref_model", "ref_column", "position"]
    extra = 1


class BayesianNetworkNodeInline(NestedStackedInline):
    model = BayesianNetworkNode
    extra = 1
    inlines = [BayesianNetworkNodeColumnInline, ]
    fieldsets = (
        (None, {
            'fields': ('name', 'node_type',)
        }),
        ("Stochastic Type", {
            'fields': (('distribution', 'distribution_params'),
                       'is_observable', ),
        }),
        ("Deterministic Type", {
            'fields': (('deterministic', 'deterministic_params'), ),
        }),
        ("Visualization", {
            'classes': ('collapse',),
            'fields': (('graph_interval', 'image'), ),
        }),
        ("Timestamps", {
            'classes': ('collapse',),
            'fields': (('engine_object_timestamp',
                        'engine_inferred_object_timestamp'), ),
        }),
    )

    class Media:
        css = {
            'all': ('/static/css/admin/bayesian_networks.css',)
        }


class BayesianNetworkEdgeInline(NestedTabularInline):
    model = BayesianNetworkEdge
    extra = 1

    def formfield_for_foreignkey(self, db_field,
                                 request=None, **kwargs):  # pragma: no cover
        field = super(BayesianNetworkEdgeInline, self)\
            .formfield_for_foreignkey(db_field, request, **kwargs)
        # Display only Nodes from the Network or None
        if db_field.name in ['child', 'parent']:
            if request._obj_ is not None:
                field.queryset = field.queryset.filter(network=request._obj_)
            else:
                field.queryset = field.queryset.none()
        return field


@admin.register(BayesianNetwork)
class BayesianNetworkAdmin(NestedModelAdmin):
    fieldsets = (
        (None, {
            'fields': ('name', 'network_type', 'results_storage')
        }),
        ("Miscellanous", {
            'classes': ('collapse',),
            'fields': (
                ('engine_meta_iterations', 'engine_iterations'),
                ('counter', 'counter_threshold', 'threshold_actions'),
                ('engine_object_timestamp', 'image'),
                'metadata',
            ),
        }),
    )
    inlines = [
        BayesianNetworkNodeInline,
        BayesianNetworkEdgeInline,
    ]

    def get_form(self, request, obj=None, **kwargs):  # pragma: no cover
        # Save obj reference in the request for future processing in Inline
        request._obj_ = obj
        form = super(BayesianNetworkAdmin, self).get_form(request, obj,
                                                          **kwargs)
        form.base_fields["metadata"].widget.attrs["disabled"] = "disabled"
        return(form)

# @admin.register(BayesianNetworkNode)
# class BayesianNetworkNodeAdmin(admin.ModelAdmin):
#     pass


# @admin.register(BayesianNetworkEdge)
# class BayesianNetworkNodeEdge(admin.ModelAdmin):
#     pass