# 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
from app.util.component.StructuredPrint import StructurePrint
import json
import traceback

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:
                try:
                    zoo.start()
                except:
                    pass

        # 更新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()
                zoo.close()
                del zoo
            except Exception as e:
                StructurePrint().print("关闭zoo失败")
                StructurePrint().print(e.__str__())
            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