/*
 * Copyright (C) 2015 Google Inc.
 *
 * Licensed under the Apache License, Version 2.0 (the "License"); you may not
 * use this file except in compliance with the License. You may obtain a copy of
 * the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
 * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
 * License for the specific language governing permissions and limitations under
 * the License.
 */

package com.googlecode.android_scripting.dialog;

import android.app.Activity;
import android.app.AlertDialog;
import android.content.ComponentName;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.SharedPreferences;
import android.content.res.AssetManager;
import android.net.Uri;
import android.preference.PreferenceManager;

import com.googlecode.android_scripting.Constants;
import com.googlecode.android_scripting.Log;
import com.googlecode.android_scripting.R;
import com.googlecode.android_scripting.interpreter.InterpreterConstants;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.zip.ZipEntry;
import java.util.zip.ZipInputStream;

import org.connectbot.HelpActivity;

public class Help {
  private Help() {
    // Utility class.
  }

  private static int helpChecked = 0;

  public static boolean checkApiHelp(Context context) {
    byte[] buf = new byte[1024];
    if (helpChecked == 0) {
      try {
        File dest = new File(InterpreterConstants.SDCARD_SL4A_DOC);
        if (!dest.exists()) {
          dest.mkdirs();
        }
        new File(InterpreterConstants.SDCARD_SL4A_DOC, "index.html");
        AssetManager assetManager = context.getAssets();
        ZipInputStream zip = new ZipInputStream(assetManager.open("sl4adoc.zip"));
        ZipEntry entry;
        while ((entry = zip.getNextEntry()) != null) {
          File file = new File(InterpreterConstants.SDCARD_SL4A_DOC, entry.getName());
          if (!file.exists() || file.lastModified() < entry.getTime()) {
            if (!file.exists() && !file.getParentFile().exists()) {
              file.getParentFile().mkdirs();
            }
            OutputStream output = new BufferedOutputStream(new FileOutputStream(file));
            int len;
            while ((len = zip.read(buf)) > 0) {
              output.write(buf, 0, len);
            }
            output.flush();
            output.close();
            file.setLastModified(entry.getTime());
          }
        }
        helpChecked = 1;
      } catch (IOException e) {
        Log.e("Help not found ", e);
        helpChecked = -1;
        return false;
      }
    }
    return helpChecked > 0;
  }

  public static void showApiHelp(Context context, String help) {
    Intent intent = new Intent();
    intent.setAction(Intent.ACTION_VIEW);
    Uri uri = Uri.parse("file://" + InterpreterConstants.SDCARD_SL4A_DOC + help);
    intent.setDataAndType(uri, "text/html");
    SharedPreferences p = PreferenceManager.getDefaultSharedPreferences(context);
    if (p.getBoolean(Constants.FORCE_BROWSER, true)) {
      intent.setComponent(new ComponentName("com.android.browser",
          "com.android.browser.BrowserActivity"));
    }
    context.startActivity(intent);
  }

  public static void show(final Activity activity) {
    AlertDialog.Builder builder = new AlertDialog.Builder(activity);
    List<CharSequence> list = new ArrayList<CharSequence>();
    list.add("Wiki Documentation");
    list.add("YouTube Screencasts");
    list.add("Terminal Help");
    if (checkApiHelp(activity)) {
      list.add("API Help");
    }
    CharSequence[] mylist = list.toArray(new CharSequence[list.size()]);
    builder.setItems(mylist, new DialogInterface.OnClickListener() {
      @Override
      public void onClick(DialogInterface dialog, int which) {
        switch (which) {
        case 0: {
          Intent intent = new Intent();
          intent.setAction(Intent.ACTION_VIEW);
          intent.setData(Uri.parse(activity.getString(R.string.wiki_url)));
          activity.startActivity(intent);
          break;
        }
        case 1: {
          Intent intent = new Intent();
          intent.setAction(Intent.ACTION_VIEW);
          intent.setData(Uri.parse(activity.getString(R.string.youtube_url)));
          activity.startActivity(intent);
          break;
        }
        case 2: {
          Intent intent = new Intent(activity, HelpActivity.class);
          activity.startActivity(intent);
          break;
        }
        case 3: {
          showApiHelp(activity, "index.html");
        }
        }
      }
    });
    builder.show();
  }
}
