/*
 * Copyright (C) 2017 The Android Open Source Project
 *
 * 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.provider;

import android.app.SearchManager;
import android.content.ContentProvider;
import android.content.ContentValues;
import android.content.Context;
import android.content.Intent;
import android.content.UriMatcher;
import android.content.Intent.ShortcutIconResource;
import android.database.Cursor;
import android.database.MatrixCursor;
import android.net.Uri;
import android.provider.BaseColumns;
import android.provider.LiveFolders;

import com.googlecode.android_scripting.FeaturedInterpreters;
import com.googlecode.android_scripting.IntentBuilders;
import com.googlecode.android_scripting.R;
import com.googlecode.android_scripting.ScriptStorageAdapter;
import com.googlecode.android_scripting.interpreter.Interpreter;
import com.googlecode.android_scripting.interpreter.InterpreterConfiguration;
import com.googlecode.android_scripting.interpreter.InterpreterConstants;

import java.io.File;

public class ScriptProvider extends ContentProvider {

  public static final String SINGLE_MIME = "vnd.android.cursor.item/vnd.sl4a.script";
  public static final String MULTIPLE_MIME = "vnd.android.cursor.dir/vnd.sl4a.script";

  private static final int LIVEFOLDER_ID = 1;
  private static final int SUGGESTIONS_ID = 2;

  public static final String AUTHORITY = ScriptProvider.class.getName().toLowerCase();
  public static final String LIVEFOLDER = "liveFolder";
  public static final String SUGGESTIONS = "searchSuggestions/*/*";

  private final UriMatcher mUriMatcher;

  private Context mContext;
  private InterpreterConfiguration mConfiguration;

  public ScriptProvider() {
    mUriMatcher = new UriMatcher(UriMatcher.NO_MATCH);
    mUriMatcher.addURI(AUTHORITY, LIVEFOLDER, LIVEFOLDER_ID);
    mUriMatcher.addURI(AUTHORITY, SUGGESTIONS, SUGGESTIONS_ID);
  }

  @Override
  public int delete(Uri uri, String selection, String[] selectionArgs) {
    return 0;
  }

  @Override
  public String getType(Uri uri) {
    if (uri.getLastPathSegment().equals("scripts")) {
      return MULTIPLE_MIME;
    }
    return SINGLE_MIME;
  }

  @Override
  public Uri insert(Uri uri, ContentValues values) {
    return null;
  }

  @Override
  public boolean onCreate() {
    mContext = getContext();
    mConfiguration = new InterpreterConfiguration(mContext);
    mConfiguration.startDiscovering();
    return true;
  }

  @Override
  public Cursor query(Uri uri, String[] projection, String selection, String[] selectionArgs,
      String sortOrder) {
    switch (mUriMatcher.match(uri)) {
    case LIVEFOLDER_ID:
      return queryLiveFolder();
    case SUGGESTIONS_ID:
      String query = uri.getLastPathSegment().toLowerCase();
      return querySearchSuggestions(query);
    default:
      return null;
    }
  }

  private Cursor querySearchSuggestions(String query) {
    String[] columns =
        { BaseColumns._ID, SearchManager.SUGGEST_COLUMN_TEXT_1,
          SearchManager.SUGGEST_COLUMN_TEXT_2, SearchManager.SUGGEST_COLUMN_ICON_2,
          SearchManager.SUGGEST_COLUMN_QUERY, SearchManager.SUGGEST_COLUMN_SHORTCUT_ID };
    MatrixCursor cursor = new MatrixCursor(columns);
    int index = 0;
    for (File script : ScriptStorageAdapter.listExecutableScripts(null, mConfiguration)) {
      String scriptName = script.getName().toLowerCase();
      if (!scriptName.contains(query)) {
        continue;
      }
      Interpreter interpreter = mConfiguration.getInterpreterForScript(scriptName);
      String secondLine = interpreter.getNiceName();
      int icon = FeaturedInterpreters.getInterpreterIcon(mContext, interpreter.getExtension());
      Object[] row =
          { index, scriptName, secondLine, icon, scriptName,
            SearchManager.SUGGEST_NEVER_MAKE_SHORTCUT };
      cursor.addRow(row);
      ++index;
    }
    return cursor;
  }

  private Cursor queryLiveFolder() {
    String[] columns =
        { BaseColumns._ID, LiveFolders.NAME, LiveFolders.INTENT, LiveFolders.ICON_RESOURCE,
          LiveFolders.ICON_PACKAGE, LiveFolders.DESCRIPTION };
    MatrixCursor cursor = new MatrixCursor(columns);
    int index = 0;
    for (File script : ScriptStorageAdapter.listExecutableScriptsRecursively(null, mConfiguration)) {
      int iconId = 0;
      if (script.isDirectory()) {
        iconId = R.drawable.folder;
      } else {
        iconId = FeaturedInterpreters.getInterpreterIcon(mContext, script.getName());
        if (iconId == 0) {
          iconId = R.drawable.sl4a_logo_32;
        }
      }
      ShortcutIconResource icon = ShortcutIconResource.fromContext(mContext, iconId);
      Intent intent = IntentBuilders.buildStartInBackgroundIntent(script);
      intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
      String description = script.getAbsolutePath();
      if (description.startsWith(InterpreterConstants.SCRIPTS_ROOT)) {
        description = description.replaceAll(InterpreterConstants.SCRIPTS_ROOT, "scripts/");
      }
      Object[] row =
          { index, script.getName(), intent.toURI(), icon.resourceName, icon.packageName,
            description };
      cursor.addRow(row);
      ++index;
    }
    return cursor;
  }

  @Override
  public int update(Uri uri, ContentValues values, String selection, String[] selectionArgs) {
    return 0;
  }

}
