/*
 * Copyright 2000-2012 JetBrains s.r.o.
 *
 * 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.intellij.spellchecker.dictionary;

import com.intellij.util.Consumer;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;

import java.util.Set;

public interface Dictionary {
  default void consumeSuggestions(@NotNull String word, @NotNull Consumer<String> consumer) {}

  @NotNull
  String getName();

  /**
   * @deprecated This method returns null if a word is alien, which is extremely confusing and may cause issues.
   * <p>
   * Please implement and use {@link #lookup(String)} instead, which provides clear status indication through {@link LookupStatus}
   */
  @Nullable
  @Deprecated(forRemoval = true)
  Boolean contains(@NotNull String word);

  @NotNull
  default LookupStatus lookup(@NotNull String word) {
    Boolean contains = contains(word);
    if (contains == null) { return LookupStatus.Alien; }
    if (contains) { return LookupStatus.Present; }
    return LookupStatus.Absent;
  }

  @NotNull
  Set<String> getWords();

  enum LookupStatus {
    Present, Absent, Alien;

    public boolean isNotPresent() {
      return this == Absent || this == Alien;
    }
  }

}
