// -*- mode: java; c-basic-offset: 2; -*-
// Copyright 2018 MIT, All rights reserved
// Released under the Apache License, Version 2.0
// http://www.apache.org/licenses/LICENSE-2.0

package com.google.appinventor.components.runtime;

import android.app.Activity;

import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;

import android.net.Uri;

import android.os.Bundle;
import android.os.Handler;

import android.support.v4.app.ActivityCompat;

import android.support.v4.content.ContextCompat;

import android.util.Log;

import android.webkit.JavascriptInterface;
import android.webkit.WebChromeClient;
import android.webkit.WebSettings;
import android.webkit.WebStorage;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import com.google.appinventor.components.runtime.util.SdkLevel;

/**
 * Create a An activity that display's the Repl's startup splash screen
 * which will introduce the REPL and ask for necessary permissions.
 *
 */
public final class SplashActivity extends AppInventorCompatActivity {

  WebView webview;
  Handler handler;

  public class JavaInterface {
    Context mContext;

    public JavaInterface(Context context) {
      mContext = context;
    }

    @JavascriptInterface
    public boolean hasPermission(String permission) {
      if (SdkLevel.getLevel() < SdkLevel.LEVEL_MARSHMALLOW) {  // permissions granted at install prior to Marshmallow
        return true;
      } else if (ContextCompat.checkSelfPermission(mContext, permission) ==
        PackageManager.PERMISSION_GRANTED) {
        return true;
      } else {
        return false;
      }
    }

    @JavascriptInterface
    public void askPermission(String permission) {
      ActivityCompat.requestPermissions((Activity) SplashActivity.this,
        new String[] { permission}, 1);
    }

    @JavascriptInterface
    public String getVersion() {
      try {
        String packageName = mContext.getPackageName();
        PackageInfo pInfo = mContext.getPackageManager().getPackageInfo(packageName, 0);
        return (pInfo.versionName);
      } catch (NameNotFoundException e) {
        return "Unknown";
      }
    }

    @JavascriptInterface
    public void finished() {
      SplashActivity.this.handler.post(new Runnable() {
          @Override
          public void run() {
            SplashActivity.this.webview.destroy();
            SplashActivity.this.finish();
          }
        });
    }
  }

  @Override
  public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    JavaInterface android = new JavaInterface(this);
    handler = new Handler();
    webview = new WebView(this);
    WebSettings webSettings = webview.getSettings();
    webSettings.setJavaScriptEnabled(true);
    webSettings.setDatabaseEnabled(true);
    webSettings.setDomStorageEnabled(true);
    String databasePath = this.getApplicationContext().getDir("database", Context.MODE_PRIVATE).getPath();
    webSettings.setDatabasePath(databasePath);

    // webview.setWebViewClient(new WebViewClient() {
    //     @Override
    //     public boolean shouldOverrideUrlLoading(WebView view, String url) {
    //       Log.i("WebView", "Handling url " + url);
    //       Uri uri = Uri.parse(url);
    //       String scheme = uri.getScheme();
    //       if (scheme.equals(Form.APPINVENTOR_URL_SCHEME)) {
    //         Intent resultIntent = new Intent();
    //         resultIntent.setData(uri);
    //         setResult(RESULT_OK, resultIntent);
    //         finish();
    //       } else {
    //         view.loadUrl(url);
    //       }
    //       return true;
    //     }
    //   });

    webview.setWebChromeClient(new WebChromeClient() {
        @Override
        public void onExceededDatabaseQuota(String url, String databaseIdentifier,
          long currentQuota, long estimatedSize, long totalUsedQuota,
          WebStorage.QuotaUpdater quotaUpdater) {
          quotaUpdater.updateQuota(5 * 1024 * 1024);
        }
      });
    setContentView(webview);
    // Uncomment the line below to enable debugging
    // the splash screen (splash.html)
    //
    // webview.setWebContentsDebuggingEnabled(true);
    webview.addJavascriptInterface(android, "Android");
    webview.loadUrl("file:///android_asset/splash.html");
  }

  @Override
  public void onRequestPermissionsResult(int code,
    String permissions[], int[] grantResults) {
    for (int i = 0; i < permissions.length; i++ ) {
      String permission = permissions[i];
      int grantResult = grantResults[i];
      boolean granted = false;
      if (grantResult == PackageManager.PERMISSION_GRANTED) {
        granted = true;
      }
      webview.loadUrl("javascript:permresult('" + permission + "'," + granted + ")");
    }
  }

}