package com.persagy.dmp.common.context;

import lombok.extern.slf4j.Slf4j;

import java.io.Serializable;


/**
 * 应用访问上下文类，主要负责上下文的属性和参数的操作
 * @author Charlie Yu
 * @version 1.0 2021-03-04
 */
@Slf4j
public abstract class AppContext implements Serializable {

    /** 序列id */
    private static final long serialVersionUID = 697592850956445675L;
    /** 集团编码 */
    public static final String GROUP_CODE = "groupCode";
    /** 应用标识 */
    public static final String APP_ID = "appId";
    /** 用户ID */
    public static final String ACCOUNT_ID = "accountId";
    /** 项目ID */
    public static final String PROJECT_ID = "projectId";
    /** 数据源 */
    public static final String DATA_SOURCE_NAME = "dataSourceName";

    /** 工厂对象 */
    private static IAppContextFactory factory = null;

    /**
     * 取得当前线程中的上下文对象
     * @return 上下文对象
     */
    public static AppContext getContext() {
        return getFactory().getContext();
    }

    /**
     * 反注册当前上下文对象
     */
    public static void unload() {
        getFactory().unloadContext();
    }

    /**
     * 取得上下文工厂类
     * @return 上下文工厂类
     */
    public static IAppContextFactory getFactory() {
        if (factory == null) {
            factory = new DefaultAppContextFactory();
        }
        return factory;
    }

    /**
     * 动态数据源支持
     * @return java.lang.String
     **/
    public abstract String getDataSourceName();

    /**
     * 设置动态数据源
     * @param dataSourceName 动态数据源
     * @return void
     **/
    public abstract void setDataSourceName(String dataSourceName);

    /**
     * 设置用户主键
     * @param accountId 用户主键
     * @return void
     **/
    public abstract void setAccountId(String accountId);
    /**
     * 设置项目ID
     * @param projectId 项目ID
     * @return void
     **/
    public abstract void setProjectId(String projectId);
    /**
     * 设置集团编码
     * @param groupCode 集团编码
     * @return void
     **/
    public abstract void setGroupCode(String groupCode);
    /**
     * 设置应用标识
     * @param appId 应用标识
     * @return void
     **/
    public abstract void setAppId(String appId);
    /**
     * 获取用户ID
     * @return 用户ID
     **/
    public abstract String getAccountId();
    /**
     * 获取项目ID
     * @return 项目ID
     **/
    public abstract String getProjectId();
    /**
     * 获取集团编码
     * @return 集团编码
     **/
    public abstract String getGroupCode();
    /**
     * 获取应用标识
     * @return 应用标识
     **/
    public abstract String getAppId();
}
