# 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
from app.util.component.ModelVisitor import ModelVisitor

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=1)
            zoo.start()
            GLOBAL_DIC["zookeeper"] = zoo
            GLOBAL_DIC["zookeeper_updatetime"] = time.time()
        else:
            if not zoo.connected:
                zoo.start()

        # 更新zoo
        if not  GLOBAL_DIC.get("zookeeper_updatetime"):
            GLOBAL_DIC["zookeeper_updatetime"] = time.time()
        if time.time() - GLOBAL_DIC["zookeeper_updatetime"] > 15:
            #释放
            try:
                zoo.stop()
            except:
                pass
            zoo: KazooClient = KazooClient(hosts=configure.zookeeper, timeout=1)
            zoo.start()
            GLOBAL_DIC["zookeeper"] = zoo
            GLOBAL_DIC["zookeeper_updatetime"] = time.time()

        # 缓存数据服务器
        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"] > 15:
            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") > 15:
                if type.__eq__("guid"):
                    image_service: ImageService = ImageService.query.filter_by(guid=guid_or_name).one_or_none()
                else:
                    image_service: ImageService = ImageService.query.filter_by(name=guid_or_name).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": ModelVisitor.object_to_json(image_service),
                                                "images": ModelVisitor.objects_to_jsonarray(images),
                                                "scheme": json.loads(scheme.parameter)}
                else:

                    GLOBAL_DIC[guid_or_name] = {"service": ModelVisitor.object_to_json(image_service),
                                                "images": ModelVisitor.objects_to_jsonarray(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