# 使用提醒:
# 1. xbot包提供软件自动化、数据表格、Excel、日志、AI等功能
# 2. package包提供访问当前应用数据的功能,如获取元素、访问全局变量、获取资源文件等功能
# 3. 当此模块作为流程独立运行时执行main函数
# 4. 可视化流程中可以通过"调用模块"的指令使用此模块

import xbot
from xbot import print, sleep
from .import package
from .package import variables as glv

from functools import wraps
from xbot_extensions.activity_photoshop import ps_back

IT_BEEN_DECORATED = False

_original_set_text_of_layer_by_name = ps_back.set_text_of_layer_by_name
_original_change_content_of_layer_by_name_from_file = ps_back.change_content_of_layer_by_name_from_file


def get_layer_by_name(ps_instance, layer_name):
    if ">" not in layer_name:
        try:
            active_layer = ps_instance.app.ActiveDocument.ArtLayers(layer_name)
        except:
            active_layer = ps_instance.layer(layer_name, only_visible=False)
    else: 
        *layersets, layer_name = [path.strip() for path in layer_name.split(">")]
        current_layerset = ps_instance.doc
        for layerset_name in layersets:
            current_layerset = current_layerset.LayerSets(layerset_name)
        active_layer = current_layerset.Layers(layer_name)
    return active_layer


def decorator(func):
    @wraps(func)
    def wrapper(*args, **kwargs):
        ps_instance = kwargs['photoshop_instance']
        layer_name = kwargs['name_of_layer']
        layer = get_layer_by_name(ps_instance, layer_name)
        before_replace_bounds = layer.Bounds
        func(*args, **kwargs)
        after_replace_bounds = layer.Bounds
        center_x = (before_replace_bounds[0] + before_replace_bounds[2]) // 2
        center_y = (before_replace_bounds[1] + before_replace_bounds[3]) // 2
        new_center_x = (after_replace_bounds[0] + after_replace_bounds[2]) // 2
        new_center_y = (after_replace_bounds[1] + after_replace_bounds[3]) // 2
        x_offset = center_x - new_center_x
        y_offset = center_y - new_center_y
        layer.Translate(x_offset, y_offset)
    return wrapper


def add_patch_decorator():
    global IT_BEEN_DECORATED
    if IT_BEEN_DECORATED:
        return

    # 应用装饰器
    ps_back.set_text_of_layer_by_name = decorator(_original_set_text_of_layer_by_name)
    ps_back.change_content_of_layer_by_name_from_file = decorator(_original_change_content_of_layer_by_name_from_file)
    IT_BEEN_DECORATED = True


def remove_patch_decorator():
    global IT_BEEN_DECORATED
    if not IT_BEEN_DECORATED:
        return

    # 移除装饰器
    ps_back.set_text_of_layer_by_name = _original_set_text_of_layer_by_name
    ps_back.change_content_of_layer_by_name_from_file = _original_change_content_of_layer_by_name_from_file
    IT_BEEN_DECORATED = False