# -*- coding:utf-8 -*-
"""
@author: yq
@time: 2022/10/24
@desc: 指标计算相关
"""

import threading

from commom import f_get_clazz_in_module, GeneralException
from enums import ResultCodesEnum
from .metric_base import MetricBase
from .metric_by_sql_general import MetricBySqlGeneral

__all__ = ['f_get_metric_clazz_dict', 'f_register_metric_func', 'MetricBase', 'MetricBySqlGeneral']

lock = threading.Lock()
metric_clazz_dict = {}


def _update_metric_clazz_dict(key, value):
    with lock:
        if key in metric_clazz_dict.keys():
            raise GeneralException(ResultCodesEnum.ILLEGAL_PARAMS, message=f"自定义指标函数【{key}】已注册或出现重名")
        metric_clazz_dict[key] = value


def f_register_metric_func(clazz: MetricBase):
    if not hasattr(clazz, '_symbol') or not clazz._symbol == MetricBase._symbol:
        raise GeneralException(ResultCodesEnum.ILLEGAL_PARAMS, message=f"自定义指标函数没有继承类【MetricBase】")
    _update_metric_clazz_dict(clazz.__name__, clazz)


def f_get_metric_clazz_dict():
    return metric_clazz_dict


all_classes = f_get_clazz_in_module(__import__(__name__))
for clazz in all_classes:
    if not hasattr(clazz, '_symbol') or not clazz._symbol == MetricBase._symbol:
        continue
    f_register_metric_func(clazz)

if __name__ == "__main__":
    pass
