package com.vpnpanel.security;

import android.content.Context;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.Signature;
import android.os.Build;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.security.MessageDigest;

/**
 * مدیر امنیت اپلیکیشن
 * جلوگیری از Root, Tampering, Emulator, Debugger
 */
public class SecurityManager {

    private static SecurityManager instance;
    private Context context;

    private SecurityManager(Context context) {
        this.context = context.getApplicationContext();
    }

    public static synchronized SecurityManager getInstance(Context context) {
        if (instance == null) {
            instance = new SecurityManager(context);
        }
        return instance;
    }

    /**
     * بررسی کامل امنیت اپلیکیشن
     */
    public boolean isAppSecure() {
        if (isDeviceRooted()) {
            return false;
        }

        if (isAppTampered()) {
            return false;
        }

        if (isRunningOnEmulator()) {
            return false;
        }

        if (isDebuggerConnected()) {
            return false;
        }

        return true;
    }

    /**
     * تشخیص Root
     */
    public boolean isDeviceRooted() {
        return checkRootMethod1() || checkRootMethod2() || checkRootMethod3();
    }

    private boolean checkRootMethod1() {
        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;
            }
        }
        return false;
    }

    private boolean checkRootMethod2() {
        Process process = null;
        try {
            process = Runtime.getRuntime().exec(new String[]{"which", "su"});
            BufferedReader in = new BufferedReader(new InputStreamReader(process.getInputStream()));
            return in.readLine() != null;
        } catch (Throwable t) {
            return false;
        } finally {
            if (process != null) process.destroy();
        }
    }

    private boolean checkRootMethod3() {
        String[] packages = {
            "com.noshufou.android.su",
            "com.noshufou.android.su.elite",
            "eu.chainfire.supersu",
            "com.koushikdutta.superuser",
            "com.thirdparty.superuser",
            "com.yellowes.su",
            "com.topjohnwu.magisk"
        };

        PackageManager pm = context.getPackageManager();
        for (String packageName : packages) {
            try {
                pm.getPackageInfo(packageName, 0);
                return true;
            } catch (PackageManager.NameNotFoundException e) {
                // Package not found
            }
        }
        return false;
    }

    /**
     * تشخیص تغییرات در APK (Anti-Tampering)
     */
    public boolean isAppTampered() {
        try {
            PackageInfo packageInfo = context.getPackageManager()
                .getPackageInfo(context.getPackageName(), PackageManager.GET_SIGNATURES);

            Signature[] signatures = packageInfo.signatures;
            MessageDigest md = MessageDigest.getInstance("SHA-256");

            for (Signature signature : signatures) {
                md.update(signature.toByteArray());
            }

            String currentSignature = bytesToHex(md.digest());

            // TODO: جایگزین کنید با Hash امضای واقعی APK
            // برای دریافت Hash: keytool -printcert -jarfile app-release.apk
            String expectedSignature = "YOUR_ACTUAL_APK_SIGNATURE_HASH";

            // در حالت Development این چک را غیرفعال کنید
            if (BuildConfig.DEBUG) {
                return false;
            }

            return !currentSignature.equals(expectedSignature);
        } catch (Exception e) {
            return true; // در صورت خطا، فرض می‌کنیم Tamper شده
        }
    }

    /**
     * تشخیص Emulator
     */
    public boolean isRunningOnEmulator() {
        return (Build.FINGERPRINT.startsWith("generic")
            || Build.FINGERPRINT.startsWith("unknown")
            || Build.MODEL.contains("google_sdk")
            || Build.MODEL.contains("Emulator")
            || Build.MODEL.contains("Android SDK built for x86")
            || Build.MANUFACTURER.contains("Genymotion")
            || (Build.BRAND.startsWith("generic") && Build.DEVICE.startsWith("generic"))
            || "google_sdk".equals(Build.PRODUCT));
    }

    /**
     * تشخیص Debugger
     */
    public boolean isDebuggerConnected() {
        return android.os.Debug.isDebuggerConnected();
    }

    /**
     * تبدیل Byte به Hex
     */
    private String bytesToHex(byte[] bytes) {
        StringBuilder result = new StringBuilder();
        for (byte b : bytes) {
            result.append(String.format("%02X", b));
        }
        return result.toString();
    }

    /**
     * بررسی اتصال به اینترنت امن
     */
    public boolean isSecureConnection() {
        // بررسی اتصال به VPN شخص ثالث
        // جلوگیری از Packet Sniffing
        return true; // پیاده‌سازی بیشتر در صورت نیاز
    }
}
