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

from __future__ import division

from django.conf import settings
from django.contrib.auth.hashers import make_password
from django_logit import logit
from django_response import response
from paginator import pagination

from mch.models import AdministratorInfo, OperatorInfo
from utils.error.errno_utils import AdministratorStatusCode, OperatorStatusCode


@logit
def operator_add(request):
    name = request.POST.get('name', '')
    phone = request.POST.get('phone', '')
    password = request.POST.get('password', '')

    admin_id = request.session.get('admin_id')

    try:
        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
    except AdministratorInfo.DoesNotExist:
        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)

    try:
        operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, phone=phone, user_status=OperatorInfo.ACTIVATED, status=True)
    except OperatorInfo.DoesNotExist:
        operator = None

    if operator:
        return response(OperatorStatusCode.OPERATOR_PHONE_ALREADY_EXISTS)

    encryption = make_password(password, settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)

    OperatorInfo.objects.create(
        brand_id=administrator.brand_id,
        name=name,
        phone=phone,
        encryption=encryption,
    )

    return response(200, 'Operator Add Success', u'操作员添加成功')


@logit
def operator_delete(request):
    operator_id = request.POST.get('operator_id', '')

    admin_id = request.session.get('admin_id')

    try:
        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
    except AdministratorInfo.DoesNotExist:
        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)

    try:
        operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, operator_id=operator_id, status=True)
    except OperatorInfo.DoesNotExist:
        return response(OperatorStatusCode.OPERATOR_NOT_FOUND)

    if operator.user_status == OperatorStatusCode.OPERATOR_HAS_DISABLED:
        return response(OperatorStatusCode.OPERATOR_HAS_DISABLED)
    elif operator.user_status == OperatorStatusCode.OPERATOR_HAS_DELETED:
        return response(OperatorStatusCode.OPERATOR_HAS_DELETED)

    operator.user_status = OperatorInfo.DELETED
    operator.save()

    return response(200, 'Operator Delete Success', u'操作员删除成功')


@logit
def operator_update(request):
    operator_id = request.POST.get('operator_id', '')
    name = request.POST.get('name', '')
    password = request.POST.get('password', '')

    admin_id = request.session.get('admin_id')

    try:
        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
    except AdministratorInfo.DoesNotExist:
        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)

    try:
        operator = OperatorInfo.objects.get(brand_id=administrator.brand_id, operator_id=operator_id, status=True)
    except OperatorInfo.DoesNotExist:
        return response(OperatorStatusCode.OPERATOR_NOT_FOUND)

    if operator.user_status == OperatorStatusCode.OPERATOR_HAS_DISABLED:
        return response(OperatorStatusCode.OPERATOR_HAS_DISABLED)
    elif operator.user_status == OperatorStatusCode.OPERATOR_HAS_DELETED:
        return response(OperatorStatusCode.OPERATOR_HAS_DELETED)

    if name:
        operator.name = name
    if password:
        operator.encryption = make_password(password, settings.MAKE_PASSWORD_SALT, settings.MAKE_PASSWORD_HASHER)

    operator.save()

    return response(200, 'Operator Update Success', u'操作员更新成功')


@logit
def operator_list(request):
    page = request.POST.get('page', 1)
    num = request.POST.get('num', 20)

    admin_id = request.session.get('admin_id')

    try:
        administrator = AdministratorInfo.objects.get(admin_id=admin_id, user_status=AdministratorInfo.ACTIVATED, status=True)
    except AdministratorInfo.DoesNotExist:
        return response(AdministratorStatusCode.ADMINISTRATOR_NOT_FOUND)

    optors = OperatorInfo.objects.filter(brand_id=administrator.brand_id, user_status=OperatorInfo.ACTIVATED, status=True).order_by('-pk')
    count = optors.count()
    optors, left = pagination(optors, page, num)
    optors = [optor.data for optor in optors]

    return response(200, 'Get Operator List Success', u'获取操作员列表成功', {
        'optors': optors,
        'count': count,
        'left': left,
    })