package net.northking.cctp.element.core;

import java.util.Map;

/**
 * 脚本执行上下文接口
 *
 * @author xuyang.wang
 */
public interface IExecuteContext {

    String KEY_DRIVER = DeviceDriver.class.getCanonicalName();

    /**
     * 设置脚本变量
     *
     * @param key
     * @param value
     */
    void setVariable(String key, String value);

    /**
     * 获取脚本变量
     *
     * @param key
     * @return
     */
    String getVariable(String key);

    /**
     * 获取变量对应的值
     * @param var
     * @return
     */
    String getVariableValue(String var);
    /**
     * 设置项目全局变量
     *
     * @param key
     * @param val
     */
    void setProjectGlobalVariable(String key, String val);

    /**
     * 获取项目全局变量
     *
     * @param key
     * @return
     */
    String getProjectGlobalVariable(String key);

    /**
     * 获取服务bean
     *
     * @param serivceInf
     * @param <T>
     * @return
     */
    <T> T getService(Class<T> serivceInf);

    /**
     * 获取所有上下文变量名称
     *
     * @return
     */
    String[] getAllContextNames();

    /**
     * 获取上下文变量
     *
     * @param key
     * @return
     */
    Object getContextVariable(String key);

    /**
     * 获取父级上下文
     *
     * @return
     */
    IExecuteContext getParentContext();

    /**
     * 获取当前执行步骤
     */
    IScriptStep getCurrentStep();

    /**
     * 获取测试目标信息
     *
     * @return
     */
    ITestTarget[] getTestTarget();

    /**
     * 获取变量定义类型
     *
     * @param key    变量名称
     * @param global 是否全局变量
     * @return
     */
    @Deprecated
    String getVariableType(String key, boolean global);

    /**
     * 获取配置
     *
     * @param name 配置名称 例：spring.application.name
     * @return
     */
    String getProperty(String name);

    /**
     * 获取配置，如果没有返回传入的默认值
     *
     * @param name         配置名称
     * @param defaultValue 默认值
     * @return
     */
    String getProperty(String name, String defaultValue);

    /**
     * 获取设备信息
     *
     * @return
     */
    Map<String, Object> getDeviceInfo();

    /**
     * 执行表达式
     */
    Object evalExpression(String expression);
}
