//
//  LineTranslator.cpp
//  Taro
//
//  Created by Funnygloo on 2015. 12. 15..
//  Minsu Kang
//

#include "LineTranslator.hpp"

#include "LanguageManager.hpp"
#include "PersonalDatabase.h"
#include "TutorialDatabase.h"
#include "StartScene.h"
#include "UserDeckData.h"

#if defined(BQ_ARCH_ANDROID)
#include <base/platform/android/BQ_android.h>
#endif

LineTranslator::LineTranslator(void)
{
#if defined(BQ_ARCH_ANDROID)
    m_pJavaVm = BQ_android_get_VM();
    m_pJavaVm->GetEnv((void**)&m_pJniEnv, JNI_VERSION_1_4);
    
    m_pJClass = new jclass();
    *m_pJClass = m_pJniEnv->FindClass("com/linecorp/LGJOTW/LGJOTW");
#endif
}

LineTranslator::~LineTranslator(void)
{
#if defined(BQ_ARCH_ANDROID)
    delete m_pJClass;
    m_pJavaVm->DestroyJavaVM();
#endif
    
    if(m_pInstance != NULL)
        delete m_pInstance;
}

.
.
.

void LineTranslator::lineLoginWithoutView(bool isLine)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "lineLoginWithoutView", "(Z)V");
    env->CallStaticVoidMethod( cls, mid, (jboolean)isLine);
#endif
}

void LineTranslator::lineSetUUID(std::string uuid)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "lineSetUUID", "(Ljava/lang/String;)V");
    env->CallStaticVoidMethod( cls, mid, env->NewStringUTF(uuid.c_str()));
#endif
}

void LineTranslator::lineDeleteAuthInfo(bool isLine)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "lineDeleteAuthInfo", "(Z)V");
    env->CallStaticVoidMethod( cls, mid, (jboolean)isLine);
#endif
}

.
.
.

void LineTranslator::setLineGamePush(bool isLine)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "setLineGamePush", "(Z)V");
    env->CallStaticVoidMethod( cls, mid, (jboolean)isLine);
#endif
}

const std::string LineTranslator::getProductsInfo(std::string productsID)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);

    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "lineGetProductsInfo", "(Ljava/lang/String;)Ljava/lang/String;");
    jstring jstr = (jstring)(env->CallStaticObjectMethod(cls, mid, env->NewStringUTF(productsID.c_str())));
    
    const char* returnValue = m_pJniEnv->GetStringUTFChars(jstr, 0);
    std::string output = std::string(returnValue);
    
    m_pJniEnv->ReleaseStringUTFChars(jstr, returnValue);
    
    return output;
#endif
}

void LineTranslator::doInAppPurchase(std::string data)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "lineDoInAppPurchase", "(Ljava/lang/String;)V");
    env->CallStaticVoidMethod(cls, mid, env->NewStringUTF(data.c_str()));
#endif
}

void LineTranslator::networkDisconnectedMessageBox(void)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "networkDisconnectedMessageBoxOnUiThread", "()V");
    env->CallStaticVoidMethod( cls, mid);
#endif
}

void LineTranslator::closeAppMessageBox(void)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "closeAppMessageBoxOnUiThread", "()V");
    env->CallStaticVoidMethod( cls, mid);
#endif
}

const std::string LineTranslator::callReturnString(const char* functionName)
{
#if defined(BQ_ARCH_ANDROID)
    jmethodID mid = m_pJniEnv->GetStaticMethodID(*m_pJClass, functionName, "()Ljava/lang/String;");
    jstring jstr = (jstring)(m_pJniEnv->CallStaticObjectMethod(*m_pJClass, mid));
    
    const char* chars = m_pJniEnv->GetStringUTFChars(jstr, 0);
    std::string returnStr = std::string(chars);
    
    m_pJniEnv->ReleaseStringUTFChars(jstr, chars);
    
    return returnStr;
#endif
}

.
.
.

void LineTranslator::matEventLogLevelAchieved(void)
{
#if defined(BQ_ARCH_ANDROID)
    JavaVM* vm = BQ_android_get_VM();
    JNIEnv* env;
    vm->GetEnv((void**)&env, JNI_VERSION_1_4);
    
    jclass cls = env->FindClass("com/linecorp/LGJOTW/LGJOTW");
    jmethodID mid = env->GetStaticMethodID(cls, "matEventLogLevelAchieved", "()V");
    env->CallStaticVoidMethod( cls, mid);
#endif
}

#if defined(BQ_ARCH_ANDROID)
extern "C"
{
    JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_removeUUID(JNIEnv* env, jobject thiz);
    JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_resetAllTutorial(JNIEnv* env, jobject thiz);
    JNIEXPORT jint JNICALL Java_com_linecorp_LGJOTW_LGJOTW_getCurrLanguage(JNIEnv* env, jobject thiz);
    
    JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_returnToTitleScreenWihtDeckUpdate(JNIEnv* env, jobject thiz);
    JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_returnToSkippedTitleScreen(JNIEnv* env, jobject thiz);
};

JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_removeUUID(JNIEnv* env, jobject thiz)
{
    BQ_INDEPENDENCE_LOG_DEBUG("LineTranslator", "removeUUID");
    
    // Delete local data
    PersonalDatabase::getInstance()->removeUUID();
}

JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_resetAllTutorial(JNIEnv* env, jobject thiz)
{
    BQ_INDEPENDENCE_LOG_DEBUG("LineTranslator", "resetAllTutorial");
    
    TutorialDatabase::getInstance()->resetTutee();
}

JNIEXPORT jint JNICALL Java_com_linecorp_LGJOTW_LGJOTW_getCurrLanguage(JNIEnv* env, jobject thiz)
{
    BQ_INDEPENDENCE_LOG_DEBUG("LineTranslator", "getCurrLanguage : %d", (int)LanguageManager::getInstance()->getLanguage());
    
    return (int)LanguageManager::getInstance()->getLanguage();
}

JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_returnToTitleScreenWihtDeckUpdate(JNIEnv* env, jobject thiz)
{
    BQ_INDEPENDENCE_LOG_DEBUG("LineTranslator", "returnToTitleScreenWihtDeckUpdate");
    
    UserDeckData::sharedUserDeckData()->setUpdateNeeded(true);
    cocos2d::CCDirector::sharedDirector()->replaceScene(StartScene::scene());
}

JNIEXPORT void JNICALL Java_com_linecorp_LGJOTW_LGJOTW_returnToSkippedTitleScreen(JNIEnv* env, jobject thiz)
{
    BQ_INDEPENDENCE_LOG_DEBUG("LineTranslator", "returnToSkippedTitleScreen");
    
    StartScene::sFlagSkipFrontStep = true;
    cocos2d::CCDirector::sharedDirector()->replaceScene(StartScene::scene());
}
#endif

LineTranslator* LineTranslator::m_pInstance = NULL;