# Copyright (c) Huawei Technologies Co., Ltd. 2026-2026. All rights reserved.
# OpenOLC is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#         `http://license.coscl.org.cn/MulanPSL2`
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.

import threading

from olc.config.properties_loader import OlcConfigManager
from olc.limit.limit_factory import OlcRateLimiterFactory
from olc.task_schedule.task_schedule import Task, OlcScheduleManager


def refresh_local_dyna_rate():
    limiters = OlcRateLimiterFactory.get_instance().get_dyna_limiters()
    if len(limiters) == 0:
        return

    for limiter in limiters:
        limiter.refresh_rate_limiter()


class AlgUpdate(Task):
    def run(self):
        refresh_local_dyna_rate()


class OlcAlgRefreshManager:
    _lock = threading.Lock()
    _instance = None

    @classmethod
    def get_instance(cls):
        if cls._instance is None:
            with cls._lock:
                if cls._instance is None:
                    cls._instance = cls()
        return cls._instance

    @staticmethod
    def start():
        if OlcConfigManager.get_instance().get_sdk_config().dynamic_switch:
            alg_task = AlgUpdate()
            OlcScheduleManager.get_instance().create_task(
                name="dynamic_refresh",
                task=alg_task,
                interval=1,
                pool_name="olc-dynamic-pool",
                max_worker=1,
            )
            OlcScheduleManager.get_instance().start_task(name="dynamic_refresh")