# -*- coding: utf-8 -*-

# coding = utf-8
import datetime

from django.contrib import admin
from django.db.models.aggregates import Sum
from django.utils.translation import ugettext_lazy as _

from basedata.models import ExtraParam
from common import generic
from selfhelp.models import WorkOrder, WOExtraValue, WOItem, Reimbursement, ReimbursementItem, Loan, Enroll, Feedback, \
    Activity


class ParamValueInline(admin.TabularInline):
    model = WOExtraValue
    fields = ('param_name', 'param_value')
    readonly_fields = ['param_name']

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):

        if db_field.name == 'param_name':
            app_info = generic.get_app_model_info_from_request(request)
            instance = app_info['obj']
            if instance:
                kwargs['queryset'] = ExtraParam.objects.filter(material=instance.service)

        return super(ParamValueInline, self).formfield_for_foreignkey(db_field, request, **kwargs)

    def get_extra(self, request, obj=None, **kwargs):
        if obj:
            return 0
        else:
            return 1


class ItemInline(admin.TabularInline):
    model = WOItem
    raw_id_fields = ['material']

    def get_extra(self, request, obj=None, **kwargs):
        if obj:
            return 0
        else:
            return 1


class WorkOrderAdmin(generic.BOAdmin):
    """

    """
    CODE_PREFIX = 'WO'
    CODE_NUMBER_WIDTH = 5
    list_display = ['code', 'begin', 'title', 'classification', 'business_domain', 'status']
    list_display_links = ['code', 'title']
    exclude = ['creator', 'modifier', 'creation', 'modification']
    search_fields = ['code', 'title']
    list_filter = ['classification', 'service', 'status']
    fields = (
        ('begin', 'end',),
        ('code', 'refer',), ('classification', 'business_domain',),
        ('service', 'project',),
        ('title', 'status',), ('description',), ('attach',), ('detail',)
    )
    readonly_fields = ['status']
    raw_id_fields = ['service', 'project', 'refer']
    inlines = [ItemInline, ParamValueInline]
    date_hierarchy = 'begin'

    def save_model(self, request, obj, form, change):
        if obj.user is None:
            obj.user = request.user
        super(WorkOrderAdmin, self).save_model(request, obj, form, change)

    def get_changeform_initial_data(self, request):
        import datetime
        td = datetime.date.today()
        end = td + datetime.timedelta(30)
        return {'begin': datetime.date.today, 'end': end}

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'refer':
            app_info = generic.get_app_model_info_from_request(request)
            if app_info and app_info['obj']:
                kwargs['queryset'] = WorkOrder.objects.exclude(id=app_info['id'])

        return super(WorkOrderAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)


class LoanAdmin(generic.BOAdmin):
    CODE_PREFIX = 'JK'
    CODE_NUMBER_WIDTH = 5
    list_display = ['code', 'title', 'project', 'loan_amount', 'applier', 'status']
    list_display_links = ['code', 'title']
    readonly_fields = ['status', 'logout_time', 'logout_amount']
    raw_id_fields = ['project', 'user']
    fields = (
        ('code',), ('title', 'loan_amount',), ('description',), ('project'), ('user', 'status'),
        ('logout_time', 'logout_amount',),
    )
    extra_buttons = [{'href': 'pay', 'title': _('pay')}]
    search_fields = ['code', 'title', 'user__username']
    date_hierarchy = 'begin'

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        if object_id:
            try:
                obj = Loan.objects.get(id=object_id)
                if obj and obj.status == 'P':
                    extra_context = extra_context or {}
                    extra_context.update(dict(readonly=True))
            except Exception as e:
                pass
        return super(LoanAdmin, self).changeform_view(request, object_id, form_url, extra_context)

    def save_model(self, request, obj, form, change):
        if obj and obj.user is None:
            obj.user = request.user
        super(LoanAdmin, self).save_model(request, obj, form, change)


class ReimbursementItemInline(admin.TabularInline):
    model = ReimbursementItem
    raw_id_fields = ['expense_account']

    def get_extra(self, request, obj=None, **kwargs):
        if obj:
            return 0
        else:
            return 1


class ReimbursementAdmin(generic.BOAdmin):
    CODE_PREFIX = 'BX'
    CODE_NUMBER_WIDTH = 5
    list_display = ['code', 'title', 'project', 'amount', 'applier', 'status']
    list_display_links = ['code', 'title']
    inlines = [ReimbursementItemInline]
    raw_id_fields = ['project', 'wo', 'user', 'org']
    readonly_fields = ['loan_amount', 'pay_time', 'status', 'amount']
    fieldsets = [
        (None, {'fields': [('code', 'user'), ('title', 'amount', 'status',), ('description',), ('project', 'wo',)]}),
        (_('fico'), {'fields': [('org',), ('loan',), ('logout_amount', 'pay_amount',)], 'classes': ['collapse']})
    ]
    extra_buttons = [{'href': 'pay', 'title': _('pay')}]
    search_fields = ['code', 'title', 'project__code', 'project__name', 'user__username']
    date_hierarchy = 'begin'

    def get_changeform_initial_data(self, request):
        apps = generic.get_app_model_info_from_request(request)
        obj = getattr(apps, 'obj', None)
        current = request.user
        if obj:
            current = obj.user
        sm = Loan.objects.filter(user=current).aggregate(Sum('loan_amount')).get('loan_amount__sum') or 0.00
        return {'loan_amount': sm}

    def save_model(self, request, obj, form, change):
        if obj and obj.user is None:
            obj.user = request.user

        super(ReimbursementAdmin, self).save_model(request, obj, form, change)

    def formfield_for_foreignkey(self, db_field, request=None, **kwargs):
        if db_field.name == 'loan':
            apps = generic.get_app_model_info_from_request(request)
            current = request.user
            if apps:
                obj = apps.get('obj')
                current = obj.user
                if obj.status == 'P':
                    kwargs['queryset'] = Loan.objects.filter(id=obj.loan.id)
                else:
                    kwargs['queryset'] = Loan.objects.filter(user=current, is_clear=0)
            else:
                kwargs['queryset'] = Loan.objects.filter(user=current, is_clear=0)
        return super(ReimbursementAdmin, self).formfield_for_foreignkey(db_field, request, **kwargs)

    def changeform_view(self, request, object_id=None, form_url='', extra_context=None):
        if object_id:
            try:
                obj = Reimbursement.objects.get(id=object_id)
                if obj and obj.status == 'P':
                    extra_context = extra_context or {}
                    extra_context.update(dict(readonly=True))
            except Exception as e:
                pass
        return super(ReimbursementAdmin, self).changeform_view(request, object_id, form_url, extra_context)


class EnrollInline(admin.TabularInline):
    model = Enroll


class FeedbackInline(admin.TabularInline):
    model = Feedback


class ActivityAdmin(generic.BOAdmin):
    CODE_PREFIX = 'AC'
    CODE_NUMBER_WIDTH = 5
    list_display = ['code', 'begin_time', 'end_time', 'title', 'classification', 'room']
    list_display_links = ['code', 'title']
    raw_id_fields = ['room', 'parent']
    fieldsets = [
        (None, {'fields': [('begin_time', 'end_time',), ('title', 'classification',), ('description',),
                           ('host', 'speaker',), ('room', 'location',), ('attach',)]}),
        (_('other info'),
         {'fields': [('mail_list',), ('parent',), ('mail_notice', 'short_message_notice', 'weixin_notice',)],
          'classes': ['collapse']})
    ]

    def get_changeform_initial_data(self, request):
        now = datetime.datetime.now()
        begin = now + datetime.timedelta(hours=12)
        end = begin + datetime.timedelta(hours=6)
        return {'begin_time': begin, 'end_time': end}


admin.site.register(WorkOrder, WorkOrderAdmin)
admin.site.register(Loan, LoanAdmin)
admin.site.register(Reimbursement, ReimbursementAdmin)
admin.site.register(Activity, ActivityAdmin)
