import sys, os
from typing import Any
from pathlib import Path
sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from core.logger import get_logger
log = get_logger()
sys.path.append(os.path.join(os.path.dirname(__file__)))
from .base import BaseConfig
from .options import ReleaseOptions
import dirs

def config_expand(instance: Any):
    """配置展开：
        1. 将DirAlias中的alias展开，为实际路径
        2. 将BaseConfig中的配置展开 将字符串中的{key}替换为Args._dict[key]
        3. 如果为多层嵌套，则递归展开
    Returns:
        List: 展开后的列表
    """
    _ret = []
    if isinstance(instance, str):
        # 将字符串中的{key}替换为ReleaseOptions._dict[key] 实现动态路径
        instance = dirs.str_format(instance)
        # 尝试从DirAlias中获取instance的值
        value = dirs.DirAlias.get(instance, instance)
        if value == instance:
            # 如果value和instance相同，说明其已经不可以再拓展了 已经是最终路径了
            _ret.append(instance)
        else:
            # 如果value和instance不同，说明其还可以继续拓展
            _ret.extend(config_expand(value))
    elif isinstance(instance, list):
        for item in instance:
            _ret.extend(config_expand(item))
    elif isinstance(instance, dict):
        for _, value in instance.items():
            _ret.extend(config_expand(value))
    elif isinstance(instance, BaseConfig):
        if instance._list:
            _ret.extend(config_expand(instance._list))
        elif instance._dict:
            _ret.extend(config_expand(instance._dict))
    else:
        raise ValueError(f"Invalid config type: {type(instance)}")
    #log.info(f"config_expand: {instance.__class__.__name__} {_ret}")
    return sorted(set(_ret))

def check_file_exists(item: str) -> bool:
    """检查文件是否存在
    """
    file = Path(ReleaseOptions.AlkaidRootPath) / item
    if not file.exists():
        return False
    return True