package com.android.settingslib.core;

import android.content.Context;
import android.support.v7.preference.Preference;
import android.support.v7.preference.PreferenceGroup;
import android.support.v7.preference.PreferenceScreen;
import java.util.List;

/**
 * A controller that manages event for preference.
 */
public abstract class AbstractPreferenceController {

  protected final Context mContext;

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

  /**
   * Displays preference in this controller.
   */
  public void displayPreference(PreferenceScreen screen) {
      if (isAvailable()) {
          if (this instanceof Preference.OnPreferenceChangeListener) {
              final Preference preference = screen.findPreference(getPreferenceKey());
              preference.setOnPreferenceChangeListener(
                      (Preference.OnPreferenceChangeListener) this);
          }
      } else {
          removePreference(screen, getPreferenceKey());
      }
  }

  /**
   * Updates the current status of preference (summary, switch state, etc)
   */
  public void updateState(Preference preference) {

  }

  /**
   * Updates non-indexable keys for search provider.
   *
   * Called by SearchIndexProvider#getNonIndexableKeys
   */
  public void updateNonIndexableKeys(List<String> keys) {
      if (!isAvailable()) {
          keys.add(getPreferenceKey());
      }
  }

  /**
   * Returns true if preference is available (should be displayed)
   */
  public abstract boolean isAvailable();

  /**
   * Handles preference tree click
   *
   * @param preference the preference being clicked
   * @return true if click is handled
   */
  public boolean handlePreferenceTreeClick(Preference preference) {
      return false;
  }

  /**
   * Returns the key for this preference.
   */
  public abstract String getPreferenceKey();

  /**
   * Removes preference from screen.
   */
  protected final void removePreference(PreferenceScreen screen, String key) {
      findAndRemovePreference(screen, key);
  }

  // finds the preference recursively and removes it from its parent
  private boolean findAndRemovePreference(PreferenceGroup prefGroup, String key) {
      final int preferenceCount = prefGroup.getPreferenceCount();
      for (int i = 0; i < preferenceCount; i++) {
          final Preference preference = prefGroup.getPreference(i);
          final String curKey = preference.getKey();

          if (curKey != null && curKey.equals(key)) {
              return prefGroup.removePreference(preference);
          }

          if (preference instanceof PreferenceGroup) {
              if (findAndRemovePreference((PreferenceGroup) preference, key)) {
                  return true;
              }
          }
      }
      return false;
  }

}
