package com.yaerin.xposed.hider.util;

import android.content.Context;
import android.content.pm.PackageManager;
import android.os.Build;
import android.os.Process;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;

public class Crashlytics implements Thread.UncaughtExceptionHandler {

    private Context mContext;

    public Crashlytics(Context context) {
        this.mContext = context;
    }

    @Override
    public void uncaughtException(Thread t, Throwable e) {
        e.printStackTrace();
        String crashTime =
                new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS", Locale.getDefault())
                        .format(new Date());
        String env =
                "########RuntimeEnviormentInormation#######\n" +
                        "crashTime = " + crashTime + "\n" +
                        "model = " + Build.MODEL + "\n" +
                        "android = " + Build.VERSION.RELEASE + "(" + Build.VERSION.SDK_INT + ")\n" +
                        "brand = " + Build.BRAND + "\n" +
                        "manufacturer = " + Build.MANUFACTURER + "\n" +
                        "board = " + Build.BOARD + "\n" +
                        "hardware = " + Build.HARDWARE + "\n" +
                        "device = " + Build.DEVICE + "\n" +
                        "version = " + getVersionName() + "(" + getVersionCode() + ")\n" +
                        "supportAbis = " + getSupportAbis() + "\n" +
                        "display = " + Build.DISPLAY + "\n";
        Writer writer = new StringWriter();
        PrintWriter printWriter = new PrintWriter(writer);
        e.printStackTrace(printWriter);
        Throwable cause = e.getCause();
        while (cause != null) {
            cause.printStackTrace(printWriter);
            cause = cause.getCause();
        }
        printWriter.close();
        String stack = "############ForceCloseCrashLog############\n" + writer.toString();
        String message = env + stack;
        try {
            String name = "error_log_" + crashTime + ".log";
            FileOutputStream fos =
                    new FileOutputStream(new File(mContext.getExternalFilesDir("logs"), name));
            fos.write(message.getBytes());
            fos.close();
        } catch (IOException ex) {
            ex.printStackTrace();
        }

        Process.killProcess(Process.myPid());
        System.exit(1);
    }

    private String getVersionName() {
        String versionName = "unknown";
        try {
            versionName = mContext.getPackageManager()
                    .getPackageInfo(mContext.getPackageName(), 0).versionName;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionName;
    }

    private int getVersionCode() {
        int versionCode = -1;
        try {
            versionCode = mContext.getPackageManager()
                    .getPackageInfo(mContext.getPackageName(), 0).versionCode;
        } catch (PackageManager.NameNotFoundException e) {
            e.printStackTrace();
        }
        return versionCode;
    }

    private String getSupportAbis() {
        String[] abis = Build.SUPPORTED_ABIS;
        StringBuilder abi = new StringBuilder();
        for (int i = 0; i < abis.length; i++) {
            if (i == 0) {
                abi.append(abis[i]);
            } else {
                abi.append(" & ").append(abis[i]);
            }
        }
        return abi.toString();
    }
}