package com.fkzhang.wechatunrecalled.Hooks;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.text.TextUtils;

import com.fkzhang.wechatunrecalled.Util.WechatMainDBHelper;
import com.fkzhang.wechatunrecalled.WechatPackageNames;

import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedBridge;
import de.robv.android.xposed.XposedHelpers;

import static de.robv.android.xposed.XposedHelpers.callMethod;
import static de.robv.android.xposed.XposedHelpers.callStaticMethod;
import static de.robv.android.xposed.XposedHelpers.findConstructorExact;

/**
 * Created by fkzhang on 1/16/2016.
 */
public class WechatUnrecalledHook600 extends WechatUnrecalledHook {

    protected Object mStorageObject;

    public WechatUnrecalledHook600(WechatPackageNames packageNames) {
        super(packageNames);
    }

    public void hook(ClassLoader loader) {
        try {
            hookRecall(loader);
        } catch (Exception e) {
            XposedBridge.log(e);
        }
        try {
            hookDatabase(loader);
        } catch (Exception e) {
            XposedBridge.log(e);
        }
        try {
            hookDbObject(loader);
        } catch (Exception e) {
            XposedBridge.log(e);
        }
        try {
            findAndHookConstructor("dalvik.system.DexClassLoader", loader, String.class, String.class,
                    String.class, ClassLoader.class, new XC_MethodHook() {
                        @Override
                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                            String dexPath = (String) param.args[0];
                            ClassLoader classLoader = (ClassLoader) param.thisObject;
                            if (dexPath.contains(w.packageName + ".plugin.mutidex")) {
                                try {
                                    hookSns(classLoader);
                                } catch (Exception e) {
                                    XposedBridge.log(e);
                                }
                            }
                        }
                    });
        } catch (Exception e) {
            XposedBridge.log(e);
        }
        try {
            hookApplicationPackageManager(loader);
        } catch (Throwable t) {
            XposedBridge.log(t);
        }
    }

    protected void hookNotification(final ClassLoader loader) {
        // notification
        XposedHelpers.findAndHookMethod(w.notificationClass, loader,
                "a", w.packageName + ".booter.u", String.class, String.class, int.class,
                int.class, boolean.class,
                new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);

                        String talker = (String) param.args[1];
                        String content = (String) param.args[2];
                        int type = (int) param.args[3];

                        displayNotification(param, talker, content, type);

                    }
                });
    }

    protected void hookDbObject(final ClassLoader loader) {
        XposedBridge.hookMethod(findConstructorExact(w.storageClass1, loader, w.storageMethod1),
                new XC_MethodHook() {
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        mStorageObject = param.thisObject;
                        init(loader);
                        if (mDb == null) {
                            try {
                                mDb = new WechatMainDBHelper(param.args[0]);
                                mNotificationHelper.setDB(mDb);
                            } catch (Throwable t) {
                                log(t);
                            }
                        }
                    }
                });

//        findAndHookConstructor(w.storageClass1, loader, w.storageMethod1, new XC_MethodHook() {
//            @Override
//            protected void afterHookedMethod(MethodHookParam param) throws Throwable {
//                mStorageObject = param.thisObject;
//                init(loader);
//                if (mDb == null) {
//                    try {
//                        mDb = new WechatMainDBHelper(param.args[0]);
//                        mNotificationHelper.setDB(mDb);
//                    } catch (Throwable t) {
//                        log(t);
//                    }
//                }
//            }
//        });
    }

    protected void updateMessageCount() {
        callMethod(callMethod(mStorageObject, w.msgCountMethod1, "message"), w.msgCountMethod2);
    }

    protected Bitmap getImage(String path) {
        String str = null;
        try {
            str = (String) callMethod(callStaticMethod(mImgClss, w.imageMethod1),
                    w.imageMethod2, path, "", "");
        } catch (Exception e) {
            XposedBridge.log(e);
        }

        if (TextUtils.isEmpty(str))
            return null;

        return BitmapFactory.decodeFile(str);
    }

}