package cc.winboll.studio.positions.utils;

import android.content.Context;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.text.TextUtils;
import cc.winboll.studio.libappbase.LogUtils;

/**
 * @Author ZhanGSKen&豆包大模型<zhangsken@qq.com>
 * @Date 2025/11/15 15:23
 * @Describe Activity Alias 工具类（兼容 Android 所有版本，Java 7 语法）
 * 用于获取 activity-alias 对应的原始 Activity 组件名、判断 alias 类型、获取启动组件名等
 */
public class ActivityAliasUtils {
    private static final String TAG = "ActivityAliasUtils";

    /**
     * 获取 activity-alias 指向的原始 Activity 组件名
     *
     * @param context     上下文（建议用 ApplicationContext）
     * @param aliasName   activity-alias 的组件名（完整路径，如 ".AliasActivity" 或 "com.winboll.app.AliasActivity"）
     * @return            原始 Activity 的完整组件名（如 "com.winboll.app.OriginalActivity"），失败返回 null
     */
    public static String getTargetActivityName(Context context, String aliasName) {
        // 校验参数
        if (context == null || TextUtils.isEmpty(aliasName)) {
            LogUtils.e(TAG, "getTargetActivityName: context is null or aliasName is empty");
            return null;
        }

        // 补全组件名（若传入的是短名，自动拼接包名）
        String fullAliasName = aliasName.startsWith(".")
			? context.getPackageName() + aliasName
			: aliasName;

        try {
            // 1. 获取 PackageManager
            PackageManager packageManager = context.getPackageManager();

            // 2. 解析 activity-alias 的 ActivityInfo（flag 必须设为 PackageManager.GET_META_DATA，否则可能获取不到 targetActivity）
            ActivityInfo aliasActivityInfo = packageManager.getActivityInfo(
				new android.content.ComponentName(context.getPackageName(), fullAliasName),
				PackageManager.GET_META_DATA
            );

            // 3. 获取 targetActivity（原始 Activity 组件名）
            String targetActivity = aliasActivityInfo.targetActivity;
            if (TextUtils.isEmpty(targetActivity)) {
                LogUtils.e(TAG, "getTargetActivityName: targetActivity is empty for alias " + fullAliasName);
                return null;
            }

            // 4. 补全原始 Activity 的完整包名（若 targetActivity 是短名）
            String fullTargetName = targetActivity.startsWith(".")
				? context.getPackageName() + targetActivity
				: targetActivity;

            LogUtils.d(TAG, "getTargetActivityName: alias=" + fullAliasName + ", target=" + fullTargetName);
            return fullTargetName;

        } catch (PackageManager.NameNotFoundException e) {
            LogUtils.e(TAG, "getTargetActivityName: alias not found - " + fullAliasName, e);
        } catch (Exception e) {
            LogUtils.e(TAG, "getTargetActivityName: unknown error", e);
        }
        return null;
    }

    /**
     * 判断某个组件名是否为 activity-alias（而非原始 Activity）
     *
     * @param context       上下文
     * @param componentName 待判断的组件名（完整路径）
     * @return              true：是 activity-alias；false：不是或判断失败
     */
    public static boolean isActivityAlias(Context context, String componentName) {
        // 调用 getTargetActivityName，若返回非空，则说明是 alias
        return !TextUtils.isEmpty(getTargetActivityName(context, componentName));
    }

    /**
     * 从启动的 Intent 中获取实际的目标组件名（处理 alias 场景）
     * 适用于 Activity 中获取自身真实组件名（原始 Activity 名）
     *
     * @param context  当前 Activity 上下文
     * @return         真实的目标组件名（原始 Activity 名，若为 alias 启动则返回原始 Activity，否则返回自身）
     */
    public static String getRealTargetNameFromIntent(Context context) {
        if (context == null) {
            LogUtils.e(TAG, "getRealTargetNameFromIntent: context is null");
            return null;
        }

        // 获取当前 Activity 的组件名（可能是 alias）
        String currentComponentName = context.getClass().getName();
        // 检查是否为 alias，若是则返回 target，否则返回自身
        String targetName = getTargetActivityName(context, currentComponentName);
        return TextUtils.isEmpty(targetName) ? currentComponentName : targetName;
    }

    /**
     * 获取当前活动上下文（Activity）的启动组件名（即启动时使用的组件名，可能是 alias 或原始 Activity）
     * 场景：若通过 alias 启动 Activity，返回 alias 名；若直接启动原始 Activity，返回原始 Activity 名
     *
     * @param context 当前 Activity 上下文（必须是 Activity 实例，不能是 ApplicationContext）
     * @return        启动组件的完整名，失败返回 null
     */
    public static String getLaunchComponentName(Context context) {
        // 1. 校验上下文类型（必须是 Activity，否则无法获取启动 Intent）
        if (context == null) {
            LogUtils.e(TAG, "getLaunchComponentName: context is null");
            return null;
        }
        if (!(context instanceof android.app.Activity)) {
            LogUtils.e(TAG, "getLaunchComponentName: context must be Activity instance, current is " + context.getClass().getName());
            return null;
        }

        try {
            // 2. 获取启动当前 Activity 的 Intent
            android.app.Activity activity = (android.app.Activity) context;
            Intent launchIntent = activity.getIntent();
            if (launchIntent == null) {
                LogUtils.e(TAG, "getLaunchComponentName: launch Intent is null");
                return null;
            }

            // 3. 从 Intent 中获取启动组件名（ComponentName）
            android.content.ComponentName componentName = launchIntent.getComponent();
            if (componentName == null) {
                LogUtils.e(TAG, "getLaunchComponentName: ComponentName is null in launch Intent");
                return null;
            }

            // 4. 获取组件的完整类名（即启动时使用的组件名）
            String launchComponentName = componentName.getClassName();
            LogUtils.d(TAG, "getLaunchComponentName: current launch component is " + launchComponentName);
            return launchComponentName;

        } catch (Exception e) {
            LogUtils.e(TAG, "getLaunchComponentName: failed to get launch component name", e);
            return null;
        }
    }
}

