package org.emdev.common.log;

import android.os.Build;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.StringWriter;
import java.io.Writer;
import java.lang.Thread.UncaughtExceptionHandler;
import java.text.SimpleDateFormat;
import java.util.Date;

import org.emdev.BaseDroidApp;
import org.emdev.common.android.AndroidVersion;

class EmergencyHandler implements UncaughtExceptionHandler {

    private final SimpleDateFormat SDF = new SimpleDateFormat("yyyyMMdd.HHmmss");

    private final UncaughtExceptionHandler system;

    EmergencyHandler() {
        system = Thread.getDefaultUncaughtExceptionHandler();
        Thread.setDefaultUncaughtExceptionHandler(this);
    }

    @Override
    public void uncaughtException(final Thread thread, final Throwable ex) {
        processException(ex);
        system.uncaughtException(thread, ex);
    }

    void processException(final Throwable th) {
        try {
            final String timestamp = SDF.format(new Date());

            final Writer result = new StringWriter();
            final PrintWriter printWriter = new PrintWriter(result);

            th.printStackTrace(printWriter);
            final String stacktrace = result.toString();
            printWriter.close();

            final String name = BaseDroidApp.APP_PACKAGE + "." + BaseDroidApp.APP_VERSION_NAME + "." + timestamp
                    + ".stacktrace";
            final File filename = new File(LogManager.LOG_STORAGE, name);

            writeToFile(stacktrace, filename);
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }

    private void writeToFile(final String stacktrace, final File filename) {
        try {
            final BufferedWriter bos = new BufferedWriter(new FileWriter(filename));

            bos.write("Application information:\n\n");
            bos.write("This file was generated by the " + BaseDroidApp.APP_PACKAGE + "." + BaseDroidApp.APP_VERSION_NAME
                    + "\n");
            bos.write("\nDevice information:\n\n");
            bos.write("VERSION     : " + AndroidVersion.VERSION + "\n");
            bos.write("BOARD       : " + Build.BOARD + "\n");
            bos.write("BRAND       : " + Build.BRAND + "\n");
            bos.write("CPU_ABI     : " + BaseDroidApp.BUILD_PROPS.getProperty("ro.product.cpu.abi") + "\n");
            bos.write("CPU_ABI2    : " + BaseDroidApp.BUILD_PROPS.getProperty("ro.product.cpu.abi2") + "\n");
            bos.write("DEVICE      : " + Build.DEVICE + "\n");
            bos.write("DISPLAY     : " + Build.DISPLAY + "\n");
            bos.write("FINGERPRINT : " + Build.FINGERPRINT + "\n");
            bos.write("ID          : " + Build.ID + "\n");
            bos.write("MANUFACTURER: " + BaseDroidApp.BUILD_PROPS.getProperty("ro.product.manufacturer") + "\n");
            bos.write("MODEL       : " + Build.MODEL + "\n");
            bos.write("PRODUCT     : " + Build.PRODUCT + "\n");
            bos.write("\nError information:\n\n");
            bos.write(stacktrace);
            bos.flush();
            bos.close();
            System.out.println("Stacktrace is written: " + filename);
        } catch (final Exception e) {
            e.printStackTrace();
        }
    }
}
