from print_color import *
import configparser
import os
import sys

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))

def get_value_from_lead_value_str(lead_value_str : str, lead_str, default_value = None) :
    value = default_value
    if lead_str in lead_value_str :
        value_str = lead_value_str.replace(lead_str, "")
        value_str = value_str.replace("=", "")

        try :
            value  = int(value_str)
        except Exception as e :
            pass
    return value

def get_tip_value_str(tip_str : str, key_str : str, default_string : str = None) :
    value_str = default_string
    if len(tip_str) == 0 :
        return value_str

    tip_split_strs  =  tip_str.split(",")
    for prop_str in tip_split_strs :
        if key_str in prop_str :
            prop_split_strs = prop_str.split("=")
            full_cmp_str : str = prop_split_strs[0].replace(" ", "")
            if len(prop_split_strs) >= 2 and full_cmp_str == key_str:
                value_str = prop_split_strs[1]
    return value_str 

def get_tip_value(tip_str : str, key_str : str, default_value : int) :
    value_str = get_tip_value_str(tip_str, key_str)
    value = default_value
    try :
        value = int(value_str)
    except Exception as e :
        value = default_value
    return value

def get_tip_visible_mqtt(tip_str : str, default_mqtt : str) :
    value_str = get_tip_value_str(tip_str, "Visible", default_string = default_mqtt)
    return value_str
    
def get_tip_face_detection(tip_str : str) :
    return get_tip_value(tip_str, "FaceDetect", default_value = 0)

def get_tip_frame_box(tip_str : str) :
    return get_tip_value(tip_str, "SelectBox", default_value = 0)

def get_tip_page(tip_str : str) :
    return get_tip_value(tip_str, "Page", default_value =  -1)

def get_tip_caption_str(tip_str : str) :
    return get_tip_value_str(tip_str, "Caption", default_string = "")
    
def get_tip_alias_str(tip_str : str) :
    return get_tip_value_str(tip_str, "Alias", default_string = None)
                
def get_tip_menu_sub_index(tip_str : str) :
    return get_tip_value(tip_str, "Index", default_value =  -1)

def get_tip_timeout(tip_str : str) :
    return get_tip_value(tip_str, "Timeout", default_value =  -1)

def get_tip_caption_index(tip_str : str) :
    return get_tip_value(tip_str, "CaptionIndex", default_value = -1)  

def get_tip_format(tip_str : str) :
    return get_tip_value_str(tip_str, "Format", default_string = "%1.0f")

def get_tip_circuit(tip_str : str) :
    return get_tip_value(tip_str, "circuit", default_value = -1)

def get_tip_main_index(tip_str : str) :
    return get_tip_value(tip_str, "main", default_value = -1)

def get_tip_binding_circuit(tip_str : str) :
    return get_tip_value(tip_str, "bindingcircuit", default_value = -1)

# def get_tip_group_start(tip_str : str) :
#     print_normal_msg(f"Tip String:{tip_str}")
#     return get_tip_value(tip_str, "groupstart", default_value = -1)

# def get_tip_group_end(tip_str : str) :
#     print_normal_msg(f"Tip String:{tip_str}")
#     return get_tip_value(tip_str, "groupend", default_value = -1)
def get_tip_group_start(tip_str: str):
    # 创建一个局部变量来保存传入的参数 tip_str
    local_tip_str = tip_str
    # 直接返回状态提示信息中的组开始标签数量
    return get_tip_value(local_tip_str, "groupstart", default_value=-1)

def get_tip_group_end(tip_str: str):
    # 创建一个局部变量来保存传入的参数 tip_str
    local_tip_str = tip_str
    # 直接返回状态提示信息中的组结束标签数量
    return get_tip_value(local_tip_str, "groupend", default_value=-1)

def get_tip_system(tip_str : str) :
    return get_tip_value_str(tip_str, "System", default_string = None)

def get_tip_password(tip_str : str) :
    return get_tip_value_str(tip_str, "Password", default_string = None)

#获取画布Id和摄像头Id
def get_tip_canvas_id_and_camera_id(tip_str : str) :
    canvas_id = -1
    camera_id = -1
    if len(tip_str) == 0 :
        return canvas_id, camera_id

    tip_split_strs  =  tip_str.split(",")
    for prop_str in tip_split_strs :
        if "canvas" in prop_str and "camera" in prop_str:
            prop_split_strs = prop_str.split("=")
            if len(prop_split_strs) >= 2 :
                canvas_id = get_value_from_lead_value_str(prop_split_strs[0], "canvas", -1)
                camera_id = get_value_from_lead_value_str(prop_split_strs[1], "camera", -1)
                break
    return canvas_id,  camera_id

def get_tip_mqtt_name(tip_str : str) :
    mqtt_name = get_tip_value_str(tip_str, "mqtt", default_string = None)
    if mqtt_name != None :
        return mqtt_name

    prop_split_strs  =  tip_str.split(",")
    if len(prop_split_strs[0]) == 0:
        return None
    elif "=" not in prop_split_strs[0] :
        return prop_split_strs[0]
    else :
        return None
class system_parameter :
    _instance = None

    def __new__(cls):
        if cls._instance is None:
            cls._instance = super().__new__(cls)
            cls._instance.initialize()

        return cls._instance

    def initialize(self):
        # 初始化属性，设置默认值
        default_config = {
            'screen_blanking_time': '360',
            'system_password': '2008',
            'language': 'zh_CN',
            "facerecognition_timeout": '10',
        }

        # 如果配置文件存在，加载配置
        config = configparser.ConfigParser()
        if os.path.exists("system_parameter.ini"):
            try:
                config.read("system_parameter.ini")
                system_param = config['SystemParam']
                self.screen_blanking_time = system_param.get('blanking_time', default_config['screen_blanking_time'])
                self.system_password = system_param.get('password', default_config['system_password'])
                self.language = system_param.get('language', default_config['language'])
                self.facerecognition_timeout = system_param.get('facerecognition_timeout', default_config['facerecognition_timeout'])
            except (configparser.Error, KeyError) as e:
                # 处理读取配置文件时的错误
                print(f"读取配置错误: {e}。使用默认设置。")
                self.apply_defaults(default_config)
        else:
            self.apply_defaults(default_config)
            self.write_to_ini()

    def apply_defaults(self, default_config):
        """应用默认设置。"""
        self.screen_blanking_time = default_config['screen_blanking_time']
        self.system_password = default_config['system_password']
        self.language = default_config['language']
        self.facerecognition_timeout = default_config['facerecognition_timeout']

    def write_to_ini(self):
        """将默认配置写入ini文件。"""
        config = configparser.ConfigParser()
        config['SystemParam'] = {
            'blanking_time': self.screen_blanking_time,
            'password': self.system_password,
            'language': self.language,
            'facerecognition_timeout': self.facerecognition_timeout
        }
        with open("system_parameter.ini", 'w') as configfile:
            config.write(configfile)
    

    def change_screen_blanking_time(self, time):
        self.screen_blanking_time = time
        self.write_to_ini()

    def get_screen_blanking_time(self):
        return self.screen_blanking_time
    
    def set_system_password(self, password):
        self.system_password = password
        self.write_to_ini()

    def get_system_password(self):
        return self.system_password
    
    def set_system_language(self, language):
        self.language = language
        self.write_to_ini()

    def get_system_language(self):
        return self.language
    
    def set_verify_timeout(self, timeout):
        self.facerecognition_timeout = timeout
        self.write_to_ini()
    
    def get_verify_timeout(self):
        return int(self.facerecognition_timeout)
    
    # 向文件存储系统信息
    def write_to_ini(self):
        system_param = configparser.ConfigParser()
        system_param['SystemParam'] = {'language': self.language,
                                       'blanking_time': self.screen_blanking_time,
                                       'password': self.system_password,
                                       'facerecognition_timeout': self.facerecognition_timeout}
        
        with open('system_parameter.ini', 'w') as f:
            system_param.write(f)
    