# -*- coding:utf-8 -*-
"""
@File    :   common_model
@Author  :   xuxingchen
@Version :   1.0
@Contact :   xuxingchen@sinochem.com
@Desc    :   公用的数据结构
"""
import threading
from enum import Enum
from typing import Optional

from pydantic import BaseModel


# 错误码
class ErrorCode(Enum):
    SUCCESS = (0, "全部完成下发")
    PART_SUCCESS = (10, "部分完成下发")
    FAILURE = (20, "一个都没下发成功")
    INPUT_TYPE_ERROR = (30, "入参数据类型异常")
    NEVER_POST_FACE = (40, "用户未下发过人脸")
    UNKNOWN = (90, "未知异常")

    def __new__(cls, code, message):
        obj = object.__new__(cls)
        obj._value_ = code
        obj.message = message
        return obj


class BaseInfo(BaseModel):
    def check(self):
        for attr in self.__dict__.keys():
            # if property can be null, default value should not be set to None
            if self.__dict__[attr] is None:
                raise ValueError(f"{attr} not allowed to be set to None")


class UserData:
    def __init__(self):
        self.topic: Optional[str] = None
        self.topics: list = []
        self.table_handler = None
        self.code = None
        self.token = None
        self.status: dict = {}
        self.clients: dict = {}
        self.client_id = None
        self.lock = threading.Lock()  # 添加一个锁用于线程同步

    def set_topic(self, value: str):
        with self.lock:
            self.topic = value

    def set_topics(self, value: list):
        with self.lock:
            self.topics = value

    def set_table_handler(self, value):
        with self.lock:
            self.table_handler = value

    def set_code(self, value):
        with self.lock:
            self.code = value

    def set_token(self, value):
        with self.lock:
            self.token = value

    def set_status_add(self, key, value):
        with self.lock:
            self.status[key] = value

    def set_status_remove(self, key):
        with self.lock:
            if self.status and key in self.status.keys():
                self.status.pop(key)

    def get_status(self, key):
        if self.status and key in self.status.keys():
            return self.status[key]

    def set_clients(self, value: dict):
        with self.lock:
            self.clients = value

    def set_client_add(self, key, value):
        with self.lock:
            self.clients[key] = value

    def set_client_id(self, key):
        with self.lock:
            self.client_id = key


class Project(BaseModel):
    project_name: str
    device_id: str
    subscribe_topic: str
    publish_topic: str
    gateway_id: str
    gateway_sct: str
    register_type: int


class UserInfo(BaseModel):
    user_id: str
    device_id: str
    name: str
    user_type: int  # 0:业主 1:访客
    qrcode: str = None  # 当使用二维码时，该值就是美安设备对应的userid
    face_url: str = None
