package edu.vandy;

import java.util.List;

import edu.vandy.common.ContextView;
import edu.vandy.common.ModelOps;
import edu.vandy.common.PresenterOps;
import edu.vandy.model.aidl.AcronymExpansion;
import edu.vandy.model.aidl.AcronymResults;

/**
 * Defines the interfaces for the Acronym application that are
 * required and provided by the layers in the Model-View-Presenter
 * (MVP) pattern.  This design ensures loose coupling between the
 * layers in the app's MVP-based architecture.
 */
public interface MVP {
    /**
     * This interface defines the minimum API needed by the
     * AcronymPresenter class in the Presenter layer to interact with
     * AcronymExpansionActivity in the View layer.  It extends the
     * ContextView interface so the Presentation layer can access
     * Context's defined in the View layer.
     */
    public interface RequiredViewOps
           extends ContextView {
        /**
         * Start a new Activity that displays the Acronym Expansions
         * to the user.
         * 
         * @param results
         *            List of AcronymExpansions to display.
         */
        void displayResults(List<AcronymExpansion> results,
                            String failureReason);
    }

    /**
     * This interface defines the minimum public API provided by the
     * AcronymPresenter class in the Presenter layer to the
     * AcronymExpansionActivity in the View layer.  It extends the
     * PresenterOps interface, which is instantiated by the
     * MVP.RequiredViewOps interface used to define the parameter
     * that's passed to the onConfigurationChange() method.
     */
    public interface ProvidedPresenterOps
           extends PresenterOps<MVP.RequiredViewOps> {
        /**
         * Initiate the synchronous acronym lookup when the user
         * presses the "Lookup Acronym Async" button.
         *
         * @return false if a call is already in progress, else true.
         */
        boolean expandAcronymAsync(String acronym);

        /**
         * Initiate the synchronous acronym lookup when the user
         * presses the "Lookup Acronym Sync" button.  It uses an
         * AsyncTask.
         *
         * @return false if a call is already in progress, else true.
         */
        boolean expandAcronymSync(String acronym);
    }

    /**
     * This interface defines the minimum API needed by the
     * AcronymModel class in the Model layer to interact with
     * AcronymPresenter class in the Presenter layer.  Since this
     * interface is identical to the one used by the RequiredViewOps
     * interface it simply extends it.
     */
    public interface RequiredPresenterOps
           extends RequiredViewOps {
    }

    /**
     * This interface defines the minimum public API provided by the
     * AcronymModel class in the Model layer to the AcronymPresenter
     * class in the Presenter layer.  It extends the ModelOps
     * interface, which is parameterized by the
     * MVP.RequiredPresenterOps interface used to define the argument
     * passed to the onConfigurationChange() method.
     */
    public interface ProvidedModelOps
           extends ModelOps<MVP.RequiredPresenterOps> {
        /**
         * Use a two-way synchronous AIDL call to expand the @a
         * acronym parameter.  Must be called in a background thread
         * (e.g., via AsyncTask).
         */
        List<AcronymExpansion> getAcronymExpansions(String acronym);

        /**
         * Use a two-way asynchronous AIDL call to expand the @a
         * acronym parameter.  Need not be called in a background
         * thread since the caller isn't blocked.
         */
        void getAcronymExpansions(String acronym,
                                  AcronymResults presenter);
    }
}
