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

import json
import logging

import requests
from django.conf import settings
from django.db import transaction
from django_curtail_uuid import CurtailUUID
from django_logit import logit
from django_response import response
from ipaddr import client_ip
from pyqywe_miniapp import get_userid
from pyqywe_token import access_token
from pywe_storage import RedisStorage
from TimeConvert import TimeConvert as tc

from account.models import UserInfo
from coupon.models import UserCouponInfo
from mch.models import DistributorInfo, MaintenancemanInfo, SaleclerkInfo
from member.models import RightInfo
from statistic.models import RegisterStatisticInfo
from utils.error.errno_utils import ProductBrandStatusCode, ProductDistributorStatusCode, UserStatusCode
from utils.redis.connect import r
from utils.redis.rprofile import set_profile_info


WECHAT = settings.WECHAT
logger = logging.getLogger('logit')


@logit(res=True)
@transaction.atomic
def qy_login_api(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    appId = request.POST.get('appId', 'QYMINIAPP')

    if brand_id != settings.KODO_DEFAULT_BRAND_ID:
        return response(ProductBrandStatusCode.BRAND_NOT_MATCH)

    wxcfg = WECHAT.get(appId, {})

    appid = wxcfg.get('appID')
    secret = wxcfg.get('appsecret')

    code = request.POST.get('code', '')

    userid = get_userid(appid=appid, secret=secret, code=code, storage=RedisStorage(r))

    token = access_token(appid=appid, secret=secret, storage=RedisStorage(r))

    userinfo = requests.post(url='https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=' + token + '&userid=' + userid).text
    userinfo = json.loads(userinfo)

    mobile = userinfo.get('mobile', '')

    # Get or Create User
    user, created = UserInfo.objects.select_for_update().get_or_create(appid=appid, userid=userid)

    # Set User_id
    if created:
        user.user_id = CurtailUUID.uuid(UserInfo, 'user_id')
        # 注册用户统计
        rsi, _ = RegisterStatisticInfo.objects.select_for_update().get_or_create(
            brand_id=brand_id,
            ymd=int(tc.local_string(format='%Y%m%d')),
        )
        rsi.num += 1
        rsi.save()

    # Set User Key's Value
    user.user_from = UserInfo.QYMINIAPP_USER
    user.appid = appid
    user.user_status = UserInfo.ACTIVATED
    user.signup_ip = client_ip(request)
    user.signup_at = tc.utc_datetime()
    user.phone = mobile
    user.save()

    # Store Userinfo
    set_profile_info(user)

    # 维修员登录 (122 维修部部门ID)
    if 122 in userinfo.get('department', []):
        maintenance, created = MaintenancemanInfo.objects.get_or_create(brand_id=brand_id, maintenance_phone=mobile, status=True)
        user.is_maintenance = True

        if created:
            maintenance.maintenance_name = userinfo.get('name', '')
            maintenance.maintenance_sex = userinfo.get('gender', 0)
            maintenance.maintenance_phone = mobile
            maintenance.user_id = user.user_id
            maintenance.wx_userid = userid
            maintenance.save()
    else:
        user.is_maintenance = False
        # 销售员登录
        saleclerk, created = SaleclerkInfo.objects.get_or_create(brand_id=brand_id, clerk_phone=mobile, status=True)

        if created:
            try:
                distributor = DistributorInfo.objects.get(department_id__in=userinfo.get('department', []))
            except DistributorInfo.DoesNotExist:
                return response(ProductDistributorStatusCode.DISTRIBUTOR_NOT_FOUND)

            saleclerk.brand_id = brand_id
            saleclerk.distributor_id = distributor.distributor_id
            saleclerk.distributor_name = distributor.distributor_name
            saleclerk.clerk_name = userinfo.get('name', '')
            saleclerk.sex = userinfo.get('gender', 0)
            saleclerk.clerk_phone = userinfo.get('mobile', '')
            saleclerk.user_id = user.user_id
            saleclerk.wx_userid = userid
            saleclerk.user_status = SaleclerkInfo.ACTIVATED
            saleclerk.is_auth = True
            saleclerk.save()

    user.save()

    return response(200, 'Mini App Login Success', u'微信小程序登录成功', user.brand_qydata(brand_id=brand_id))


@logit(res=True)
@transaction.atomic
def query_userinfo(request):
    brand_id = request.POST.get('brand_id') or settings.KODO_DEFAULT_BRAND_ID
    maintenance_id = request.POST.get('maintenance_id', '')
    memebercardcode = request.POST.get('membercardcode', '')

    try:
        user = UserInfo.objects.get(memberusercardcode=memebercardcode, status=True)
    except UserInfo.DoesNotExist:
        return response(UserStatusCode.USER_NOT_FOUND)

    # 维修人工费
    right = RightInfo.objects.get(right_id='X457xEV8KVxHQiTvhA7Dtf')
    coupons = UserCouponInfo.objects.filter(user_id=user.user_id, has_used=False, status=True)
    coupons = [coupon.data for coupon in coupons]

    right_detail = right.maintaindata(level=user.level)

    return response(200, 'UserInfo Success', u'获取用户信息成功', data={
        'coupons': coupons,
        'right': right_detail
    })