#!/usr/bin/env python
# -*- coding: utf-8 -*-

import json
import re
from zhon import (
    hanzi,
    pinyin,
)

from alpha_types.venus.enum import (
    SKIN_ALL_CLASSIFY,
    SKIN_CHECK_ITEMIZE_TYPE,
    SKIN_QUALITY_COLOR_DESC,
    SKIN_QUALITY_TEMPERATURE,
    SKIN_QUALITY_OIL_LEVEL,
    SKIN_PORE_SEVERITY,
    SKIN_ROUGHNESS_TYPE,
    SKIN_ACNE_TYPE,
    SKIN_BLACK_HEADS_TYPE,
    SKIN_DARK_CIRCLE_TYPE,
)

from utils.base import APIView, get_offset_count
from utils.logger import error_logger, info_logger


class SkinCheckPictorial(APIView):

    def get(self, request):
        try:
            data = self.rpc['venus/sun/skin_check/get_pictorial_info']().unwrap()

            for item in data:
                if item.get("skin_classify") == SKIN_ALL_CLASSIFY.SKIN_QUALITY:
                    item["skin_classifiy_desc"] = u"肤色"

        except Exception as e:
            error_logger.error(u'获取测肤榜单配置失败%s', e)
            raise

        return data

    def post(self, request):
        """
        榜单信息创建 or 更新
        :param request:
        :return:
        """
        _data = json.loads(request.POST.get("pictorial_info") or "[]")

        # 对变更数据做一层封装
        modify_data = []
        for info in _data:
            _skin_classify = info.get("skin_classify", "")
            if _skin_classify in SKIN_ALL_CLASSIFY:
                _data = {
                    "skin_classify": _skin_classify,
                    "url": info.get("url", ""),
                    "content": info.get("content", ""),
                }
                modify_data.append(_data)

        info_logger.info("skin_check pictorial modify data: {}".format(json.dumps(modify_data)))

        if modify_data:
            try:
                self.rpc['venus/sun/skin_check/pictorial_update_or_create'](
                    modify_data=modify_data
                ).unwrap()

            except Exception as e:
                error_logger.error(u'变更测肤榜单配置失败%s', e)
                raise

        return {
            "message": u"操作成功",
        }


class SkinCheckConfig(APIView):

    # 大类对应的各小类枚举类型
    enum_mapping = {
        SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR: SKIN_QUALITY_COLOR_DESC,  # 肤色
        SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE: SKIN_QUALITY_TEMPERATURE,  # 色温
        SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL: SKIN_QUALITY_OIL_LEVEL,  # 干油性
        SKIN_CHECK_ITEMIZE_TYPE.SEVERITY: SKIN_PORE_SEVERITY,  # 毛孔
        SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS: SKIN_ROUGHNESS_TYPE,  # 粗糙度
        SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD: SKIN_BLACK_HEADS_TYPE,  # 黑头
        SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE: SKIN_DARK_CIRCLE_TYPE,  # 黑眼圈
        SKIN_CHECK_ITEMIZE_TYPE.ACNE: SKIN_ACNE_TYPE,  # 痘痘
    }

    def _text_convert(self, text):
        """
        文案修正
        :param text:
        :return:
        """
        return text.replace(" ", "")

    def _input_string_check(self, text, check_str):
        # 允许输入为空
        if not text:
            return True
        """
        输入内容标签符号校验，是否都是 check_str
        :param text:
        :param check_str:
        :return:  没有标签符号，默认返回True
        """
        if re.search("[{}]+".format(hanzi.punctuation), text):  # 如果存在中文标点符号
            return False

        punctuation_marks = re.findall("[{}]+".format(pinyin.punctuation), text)  # 英文标点符号

        if len(punctuation_marks) == len(text):  # 如果全部是英文标点符号
            return False

        elif punctuation_marks:  # 判断是否都是以 check_str 分隔
            return all(map(lambda p: p == check_str, punctuation_marks))

        return True

    def get(self, request):

        data = {
            "skin_color": {},  # 肤色
            "temperature": {},  # 色温
            "oil_level": {},  # 干油性
            "severity": {},  # 毛孔
            "roughness": {},  # 粗糙度
            "black_head": {},  # 黑头
            "dark_circle": {},  # 黑眼圈
            "acne": {},  # 痘痘
            "type_1": [
                SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR,
                SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE,
                SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL,
            ],
            "type_2": [
                SKIN_CHECK_ITEMIZE_TYPE.SEVERITY,
                SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS,
            ],
            "type_3": [
                SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD,
                SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE,
                SKIN_CHECK_ITEMIZE_TYPE.ACNE,
            ],
        }

        try:
            venus_data = self.rpc['venus/sun/skin_check/all_config']().unwrap()
            data.update({
                "skin_color": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.SKIN_COLOR, {}),  # 肤色
                "temperature": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.TEMPERATURE, {}),  # 色温
                "oil_level": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.OIL_LEVEL, {}),  # 干油性
                "severity": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.SEVERITY, {}),  # 毛孔
                "roughness": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.ROUGHNESS, {}),  # 粗糙度
                "black_head": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.BLACK_HEAD, {}),  # 黑头
                "dark_circle": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.DARK_CIRCLE, {}),  # 黑眼圈
                "acne": venus_data.get(SKIN_CHECK_ITEMIZE_TYPE.ACNE, {}),  # 痘痘
            })
        except Exception as e:
            error_logger.error(u'获取测肤配置失败%s', e)
            raise

        return data

    def post(self, request):
        """
        配置 创建/修改
        :param request:
        :return:
        """
        _data = json.loads(request.POST.get("config_info") or "[]")

        # 对变更数据做一层封装
        modify_data = []
        _raise_message = ""

        for info in _data:
            _fitting = self._text_convert(info.get("fitting", ""))
            _dread = self._text_convert(info.get("dread", ""))
            _itemize_type = info.get("owner_enum", "")
            _enum_value = info.get("enum_value", "")
            maping_enum = self.enum_mapping.get(_itemize_type, None)

            if not self._input_string_check(_fitting, ","):
                _raise_message = u"{} {} 宜".format(
                    _itemize_type and SKIN_CHECK_ITEMIZE_TYPE.getDesc(_itemize_type) or u"",
                    _enum_value and maping_enum and maping_enum.getDesc(_enum_value) or u""
                )

            elif not self._input_string_check(_dread, ","):
                _raise_message = u"{} {} 忌".format(
                    _itemize_type and SKIN_CHECK_ITEMIZE_TYPE.getDesc(_itemize_type) or u"",
                    _enum_value and maping_enum and maping_enum.getDesc(_enum_value) or u""
                )

            if _raise_message:
                break

            _data = {
                "skin_check_itemize_type": _itemize_type,
                "enum_value": _enum_value,
                "fitting": _fitting,
                "dread": _dread,
                "fitting_suggest": info.get("fitting_suggest", ""),
                "dread_suggest": info.get("dread_suggest", ""),
            }
            modify_data.append(_data)

        if _raise_message:
            return {
                "message": u"{} 文案有误！请输入文字，多个文字之间以英文逗号分隔！".format(_raise_message),
            }

        info_logger.info("skin_check config modify data: {}".format(json.dumps(modify_data)))

        if modify_data:
            try:
                self.rpc['venus/sun/skin_check/config_update_or_create'](
                    modify_data=modify_data
                ).unwrap()

            except Exception as e:
                error_logger.error(u'变更测肤配置失败%s', e)
                raise

        return {
            "message": u"操作成功",
        }
