# coding=utf-8
#author:        4N
#createtime:    2021/10/18
#email:         nheweijun@sina.com


from kazoo.client import KazooClient
import configure
import time
from app.modules.service.models import ImageService
from app.modules.service.models import TileScheme,Service
import json

class Cache:

    @classmethod
    def cache_data(cls,guid_or_name,type="guid"):

        from app import GLOBAL_DIC

        # 缓存zookeeper
        zoo = GLOBAL_DIC.get("zookeeper")
        if zoo is None:
            zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=100)
            zoo.start()
            GLOBAL_DIC["zookeeper"] = zoo
        else:
            if not zoo.connected:
                zoo.start()

        # 缓存数据服务器
        servers = GLOBAL_DIC.get("servers")
        if servers is None:
            servers = zoo.get_children("/rpc")
            servers.append("本地服务器")
            GLOBAL_DIC["servers"] = servers
            GLOBAL_DIC["servers_updatetime"] = time.time()
        else:
            servers = GLOBAL_DIC.get("servers")

        # 更新缓存
        if time.time() - GLOBAL_DIC["servers_updatetime"] > 30:
            servers = zoo.get_children("/rpc")
            servers.append("本地服务器")
            GLOBAL_DIC["servers"] = servers
            GLOBAL_DIC["servers_updatetime"] = time.time()


        # 缓存服务信息
        if guid_or_name:
            image_service_info = GLOBAL_DIC.get(guid_or_name)
            if image_service_info is None or time.time() - GLOBAL_DIC.get("service_updatetime") > 30:
                if type.__eq__("guid"):
                    image_service: ImageService = ImageService.query.filter_by(guid=guid_or_name).one_or_none()
                else:
                    service = Service.query.filter_by(name=guid_or_name).one_or_none()
                    image_service: ImageService = ImageService.query.filter_by(guid=service.service_guid).one_or_none()
                images = image_service.images.all()

                if image_service.scheme_guid:
                    scheme: TileScheme = TileScheme.query.filter_by(guid=image_service.scheme_guid).one_or_none()
                    GLOBAL_DIC[guid_or_name] = {"service": image_service, "images": images,
                                             "scheme": json.loads(scheme.parameter)}
                else:

                    GLOBAL_DIC[guid_or_name] = {"service": image_service, "images": images}
                GLOBAL_DIC["service_updatetime"] = time.time()
                image_service_info = GLOBAL_DIC[guid_or_name]

            else:
                image_service_info = GLOBAL_DIC[guid_or_name]
        else:
            image_service_info = None

        return image_service_info,zoo,servers