/**
 * Copyright (c) 2005-2012 by Appcelerator, Inc. All Rights Reserved.
 * Licensed under the terms of the Eclipse Public License (EPL).
 * Please see the license.txt included with this distribution for details.
 * Any modifications to this file must keep this entire header intact.
 */
/*
 * Created on Jan 14, 2006
 */
package org.python.pydev.core;

import java.io.File;

import org.python.pydev.core.structure.CompletionRecursionException;

public interface IModule {

    /**
     * @return tokens for the wild imports.
     */
    public abstract IToken[] getWildImportedModules();

    /**
     * @return the file correspondent to this module (may be null if we are unable to get it).
     * Also, this may return a file that is not a source file (such as a .pyc or .pyd).
     */
    public abstract File getFile();

    /**
     * @return the zip file path for this module within the zip file. Should be specified (not null) only if
     * we're actually dealing with a zip file.
     */
    public abstract String getZipFilePath();

    /**
     * @return tokens for the imports in the format from xxx import yyy
     * or import xxx 
     */
    public abstract IToken[] getTokenImportedModules();

    /**
     * This function should get all that is present in the file as global tokens.
     * Note that imports should not be treated by this function (imports have their own functions).
     * 
     * @return
     */
    public abstract IToken[] getGlobalTokens();

    /**
     * This function returns the local completions 
     * @param line starts at 0
     * @param col starts at 0
     * @param localScope the local scope that was previously gotten (if null, it will be created)
     * @return
     */
    public abstract IToken[] getLocalTokens(int line, int col, ILocalScope localScope);

    public abstract boolean isInDirectGlobalTokens(String tok, ICompletionCache completionCache);

    public abstract boolean isInGlobalTokens(String tok, IPythonNature nature, ICompletionCache completionCache)
            throws CompletionRecursionException;

    /**
     * @param tok the token we are looking for
     * @param completionCache cache for holding the info requested during a find tokens operation (it may have been
     *      already used in another operation, if it was part of another major operation)
     * @return whether the passed token is part of the global tokens of this module (including imported tokens).
     * @throws CompletionRecursionException 
     */
    public abstract boolean isInGlobalTokens(String tok, IPythonNature nature, boolean searchSameLevelMods,
            ICompletionCache completionCache) throws CompletionRecursionException;

    public static final int NOT_FOUND = 0;
    public static final int FOUND_TOKEN = 1;
    public static final int FOUND_BECAUSE_OF_GETATTR = 2;

    /**
     * @param ifHasGetAttributeConsiderInTokens if this true, consider that the token is in the tokens if a __getattribute__
     * is found.
     * 
     * @param completionCache cache for holding the info requested during a find tokens operation (it may have been
     *      already used in another operation, if it was part of another major operation)
     * 
     * @return whether the passed token is part of the global tokens of this module (including imported tokens) and the 
     * actual reason why it was considered there (as indicated by the constants).
     * 
     * @see #NOT_FOUND               
     * @see #FOUND_TOKEN             
     * @see #FOUND_BECAUSE_OF_GETATTR
     * 
     * @throws CompletionRecursionException 
     */
    public int isInGlobalTokens(String tok, IPythonNature nature, boolean searchSameLevelMods,
            boolean ifHasGetAttributeConsiderInTokens, ICompletionCache completionCache)
            throws CompletionRecursionException;

    /**
     * This function can be called to find possible definitions of a token (state activation token), based on its name, line and
     * column.
     * 
     * @param line: starts at 1 (-1 if not available)
     * @param col: starts at 1 (-1 if not available)
     * @param findInfo: this is debug information gathered during a find
     * @return array of definitions.
     * @throws Exception
     */
    public abstract IDefinition[] findDefinition(ICompletionState state, int line, int col, IPythonNature nature)
            throws Exception;

    /**
     * This function should return all tokens that are global for a given token.
     * E.g. if we have a class declared in the module, we return all tokens that are 'global'
     * for the class (methods and attributes).
     * 
     * @param token
     * @param manager
     * @return
     */
    public abstract IToken[] getGlobalTokens(ICompletionState state, ICodeCompletionASTManager manager);

    /**
     * @return the docstring for a module.
     */
    public abstract String getDocString();

    /**
     * @return the name of the module
     */
    public abstract String getName();

    /**
     * @return the local scope in the module for a given line and column
     * May return null if no scope is found
     * @param line: starts at 0
     * @param col: starts at 0
     */
    public abstract ILocalScope getLocalScope(int line, int col);

    /**
     * @return true if this module is actually a package:
     *  - module with __init__.py for python
     *  - folder for java (not class)
     */
    public abstract boolean isPackage();

    /**
     * @return a string with the name of the folder for the package represented by this module -- usually, the
     * name of the module without the __init__.py.
     * 
     * Only actually applicable if isPackage == true
     */
    public String getPackageFolderName();

    /**
     * @return if this module has a from __future__ import absolute_import token declared.
     */
    public abstract boolean hasFutureImportAbsoluteImportDeclared();
}