// Copyright 2017 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.chrome.browser.contextmenu;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.support.annotation.IdRes;
import android.support.annotation.StringRes;

import org.chromium.base.Callback;
import org.chromium.chrome.R;
import org.chromium.chrome.browser.ChromeFeatureList;
import org.chromium.chrome.browser.DefaultBrowserInfo;
import org.chromium.chrome.browser.search_engines.TemplateUrlService;

/**
 * List of all predefined Context Menu Items available in Chrome.
 */
public enum ChromeContextMenuItem implements ContextMenuItem {
    // Custom Tab Group
    OPEN_IN_NEW_CHROME_TAB(
            R.string.contextmenu_open_in_new_chrome_tab, R.id.contextmenu_open_in_new_chrome_tab),
    OPEN_IN_CHROME_INCOGNITO_TAB(R.string.contextmenu_open_in_chrome_incognito_tab,
            R.id.contextmenu_open_in_chrome_incognito_tab),
    OPEN_IN_BROWSER_ID(0, R.id.contextmenu_open_in_browser_id),

    // Link Group
    OPEN_IN_OTHER_WINDOW(
            R.string.contextmenu_open_in_other_window, R.id.contextmenu_open_in_other_window),
    OPEN_IN_NEW_TAB(R.string.contextmenu_open_in_new_tab, R.id.contextmenu_open_in_new_tab),
    OPEN_IN_INCOGNITO_TAB(
            R.string.contextmenu_open_in_incognito_tab, R.id.contextmenu_open_in_incognito_tab),
    COPY_LINK_ADDRESS(R.string.contextmenu_copy_link_address, R.id.contextmenu_copy_link_address),
    COPY_LINK_TEXT(R.string.contextmenu_copy_link_text, R.id.contextmenu_copy_link_text),
    SAVE_LINK_AS(R.string.contextmenu_save_link, R.id.contextmenu_save_link_as),

    // Image Group
    LOAD_ORIGINAL_IMAGE(
            R.string.contextmenu_load_original_image, R.id.contextmenu_load_original_image),
    SAVE_IMAGE(R.string.contextmenu_save_image, R.id.contextmenu_save_image),
    OPEN_IMAGE(R.string.contextmenu_open_image, R.id.contextmenu_open_image),
    OPEN_IMAGE_IN_NEW_TAB(
            R.string.contextmenu_open_image_in_new_tab, R.id.contextmenu_open_image_in_new_tab),
    SEARCH_BY_IMAGE(R.string.contextmenu_search_web_for_image, R.id.contextmenu_search_by_image),

    // Message Group
    CALL(R.string.contextmenu_call, R.id.contextmenu_call),
    SEND_MESSAGE(R.string.contextmenu_send_message, R.id.contextmenu_send_message),
    ADD_TO_CONTACTS(R.string.contextmenu_add_to_contacts, R.id.contextmenu_add_to_contacts),
    COPY(R.string.contextmenu_copy, R.id.contextmenu_copy),

    // Video Group
    SAVE_VIDEO(R.string.contextmenu_save_video, R.id.contextmenu_save_video),

    // Other
    OPEN_IN_CHROME(R.string.menu_open_in_chrome, R.id.contextmenu_open_in_chrome),

    // Browser Action Items
    BROWSER_ACTIONS_OPEN_IN_BACKGROUND(
            R.string.browser_actions_open_in_background, R.id.browser_actions_open_in_background),
    BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB(R.string.browser_actions_open_in_incognito_tab,
            R.id.browser_actions_open_in_incognito_tab),
    BROWSER_ACTION_SAVE_LINK_AS(
            R.string.browser_actions_save_link_as, R.id.browser_actions_save_link_as),
    BROWSER_ACTIONS_COPY_ADDRESS(
            R.string.browser_actions_copy_address, R.id.browser_actions_copy_address);

    @StringRes
    private final int mStringId;
    @IdRes
    private final int mMenuId;

    /**
     * A representation of a Context Menu Item. Each item should have a string and an id associated
     * with it.
     * @param stringId The string that describes the action of the item.
     * @param menuId The id found in ids.xml.
     */
    ChromeContextMenuItem(@StringRes int stringId, @IdRes int menuId) {
        mStringId = stringId;
        mMenuId = menuId;
    }

    /**
     * Transforms the id of the item into a string. It manages special cases that need minor
     * changes due to templating.
     * @param context Requires to get the string resource related to the item.
     * @return Returns a string for the menu item.
     */
    @Override
    public String getTitle(Context context) {
        if (this == ChromeContextMenuItem.SEARCH_BY_IMAGE) {
            return context.getString(R.string.contextmenu_search_web_for_image,
                    TemplateUrlService.getInstance()
                            .getDefaultSearchEngineTemplateUrl()
                            .getShortName());
        } else if (this == OPEN_IN_BROWSER_ID) {
            return DefaultBrowserInfo.getTitleOpenInDefaultBrowser(false);
        } else if (mStringId == 0) {
            return "";
        }

        if (ChromeFeatureList.isInitialized()
                && ChromeFeatureList.isEnabled(ChromeFeatureList.INCOGNITO_STRINGS)) {
            @StringRes
            int alternativeStringId = 0;
            if (this == OPEN_IN_CHROME_INCOGNITO_TAB) {
                alternativeStringId = R.string.contextmenu_open_in_chrome_private_tab;
            } else if (this == OPEN_IN_INCOGNITO_TAB) {
                alternativeStringId = R.string.contextmenu_open_in_private_tab;
            } else if (this == BROWSER_ACTIONS_OPEN_IN_INCOGNITO_TAB) {
                alternativeStringId = R.string.browser_actions_open_in_private_tab;
            }
            if (alternativeStringId != 0) {
                return context.getString(alternativeStringId);
            }
        }

        return context.getString(mStringId);
    }

    @Override
    public void getDrawableAsync(Context context, Callback<Drawable> callback) {
        callback.onResult(null);
    }

    @Override
    public int getMenuId() {
        return mMenuId;
    }
}
