package com.ttstd.controlled.utils;

import android.content.Context;
import android.content.pm.ApplicationInfo;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.os.Build;
import android.util.Log;

import java.io.File;

/**
 * 签名与系统属性工具类
 */
public class SignatureUtils {

    private static final String TAG = "SignatureUtils";

    /**
     * 检查当前应用是否为系统应用（安装在系统分区）
     *
     * @param context 上下文
     * @return true 如果是系统应用
     */
    public static boolean isSystemApp(Context context) {
        try {
            ApplicationInfo ai = context.getPackageManager().getApplicationInfo(context.getPackageName(), 0);
            return (ai.flags & ApplicationInfo.FLAG_SYSTEM) != 0 ||
                    (ai.flags & ApplicationInfo.FLAG_UPDATED_SYSTEM_APP) != 0;
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Package not found", e);
            return false;
        }
    }

    /**
     * 检查当前应用是否具有系统签名
     * 通过比较应用签名与系统核心包 "android" 的签名是否一致来判断
     *
     * @param context 上下文
     * @return true 如果应用具有系统签名
     */
    public static boolean isSystemSignature(Context context) {
        PackageManager pm = context.getPackageManager();
        try {
            // 与系统核心包 "android" 比较签名
            int result = pm.checkSignatures(context.getPackageName(), "android");
            return result == PackageManager.SIGNATURE_MATCH;
        } catch (Exception e) {
            Log.e(TAG, "Error checking system signature", e);
            return false;
        }
    }

    /**
     * 检查是否声明并获得了系统级权限（如 INJECT_EVENTS）
     *
     * @param context    上下文
     * @param permission 权限名称
     * @return true 如果权限已授予
     */
    public static boolean hasPermission(Context context, String permission) {
        return context.checkSelfPermission(permission) == PackageManager.PERMISSION_GRANTED;
    }

    /**
     * 检查当前应用是否配置了 android:sharedUserId="android.uid.system"
     *
     * @param context 上下文
     * @return true 如果配置了系统共享 UID
     */
    public static boolean isSharedSystemUid(Context context) {
        try {
            PackageInfo pi = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
            return "android.uid.system".equals(pi.sharedUserId);
        } catch (PackageManager.NameNotFoundException e) {
            Log.e(TAG, "Package not found", e);
            return false;
        }
    }

    /**
     * 检查当前进程是否正在以系统 UID (1000) 运行
     *
     * @return true 如果当前 UID 为 1000
     */
    public static boolean isSystemUid() {
        // android.os.Process.SYSTEM_UID 为 1000
        return android.os.Process.myUid() == 1000;
    }

    /**
     * 检查系统是否已 Root
     *
     * @return true 如果检测到 Root 特征
     */
    public static boolean isDeviceRooted() {
        // 1. 检查 Build.TAGS
        String buildTags = Build.TAGS;
        if (buildTags != null && buildTags.contains("test-keys")) {
            return true;
        }

        // 2. 检查常见的 su 二进制文件路径
        String[] paths = {
                "/system/app/Superuser.apk",
                "/sbin/su",
                "/system/bin/su",
                "/system/xbin/su",
                "/data/local/xbin/su",
                "/data/local/bin/su",
                "/system/sd/xbin/su",
                "/system/bin/failsafe/su",
                "/data/local/su",
                "/su/bin/su"
        };
        for (String path : paths) {
            if (new File(path).exists()) {
                return true;
            }
        }

        // 3. 尝试执行 su 命令（虽然这更像是检测应用是否有权限，但也说明系统已 Root）
        return checkRootMethod3();
    }

    private static boolean checkRootMethod3() {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(new String[]{"/system/xbin/which", "su"});
            return process.waitFor() == 0;
        } catch (Throwable t) {
            return false;
        } finally {
            if (process != null) process.destroy();
        }
    }

    /**
     * 检查当前应用自身是否已被授予 Root 权限
     *
     * @return true 如果应用可以执行 su 并获得 root 身份
     */
    public static boolean isAppHasRootPermission() {
        Process process = null;
        try {
            // 尝试请求 su
            process = Runtime.getRuntime().exec("su");
            // 写入 exit 确保进程能正常结束
            process.getOutputStream().write("exit\n".getBytes());
            process.getOutputStream().flush();
            int exitValue = process.waitFor();
            return exitValue == 0;
        } catch (Exception e) {
            // 执行 su 失败，通常说明没有 root 权限或未安装 su
            return false;
        } finally {
            if (process != null) {
                process.destroy();
            }
        }
    }
}
