/*
 * Copyright (C) 2019 The Android Open Source Project
 *
 * 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 android.platform.helpers;

import java.util.List;

public interface IAutoDialHelper extends IAppHelper, Scrollable {

    /** enum class for contact list order type. */
    enum OrderType {
        FIRST_NAME,
        LAST_NAME
    }
    /** enum class for phone call audio channel. */
    enum AudioSource {
        PHONE,
        CAR_SPEAKERS,
    }

    /**
     * Setup expectations: The app is open and the dialpad is open
     *
     * <p>This method is used to dial the phonenumber on dialpad
     *
     * @param phoneNumber phone number to dial.
     */
    void dialANumber(String phoneNumber);

    /**
     * Setup expectations: A prompt allowing the user to select "Device" is open.
     *
     * <p>This method is meant to be used when contacts are being uploaded onto a device (the
     * confirmation dialogue allows either the device to be selected for upload, or for
     * cancellation.
     */
    void pressDeviceOnPrompt();

    /**
     * Press the contact info element on screen containing the given name.
     *
     * @param expectedName - The contact name on the contact info element
     */
    void pressContactResult(String expectedName);

    /** Assumes contact page is open. Press the mobile call button on a contact page. */
    void pressMobileCallOnContact();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to end call using softkey.
     */
    void endCall();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to open call history details.
     */
    void openCallHistory();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method dials a contact from the contact list.
     *
     * @param contactName to dial.
     */
    void callContact(String contactName);

    /**
     * Setup expectations: The app is open and in Dialpad.
     *
     * <p>This method is used to delete the number entered on dialpad using backspace
     */
    void deleteDialedNumber();

    /**
     * Setup expectations: The app is open and in Dialpad
     *
     * <p>This method is used to get the number entered on dialing screen.
     */
    String getDialedNumber();

    /**
     * Setup expectations: A call is underway, and the call screen is in focus on the device.
     *
     * <p>This method is used to get the number that is currently being dialed, or has been dialed
     * on a currently-displayed ongoing call
     */
    String getDialingNumber();

    /**
     * Setup expectations: The app is open and in Dialpad
     *
     * <p>This method is used to get the number entered on dialpad
     */
    String getNumberInDialPad();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to get the name of the contact for the ongoing call
     */
    String getDialedContactName();

    /**
     * Setup expectations: The app is open and Call History is open.
     *
     * <p>This method is used to get the most recent call history.
     */
    String getRecentCallHistory();

    /**
     * Setup expectations: The app is open and phonenumber is entered on the dialpad.
     *
     * <p>This method is used to make/receive a call using softkey.
     */
    void makeCall();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to dial a number from a list (Favorites, Call History, Contact).
     *
     * @param contact (number or name) dial.
     */
    void dialFromList(String contact);

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to enter number on the in-call dialpad.
     *
     * @param phoneNumber to dial.
     */
    void inCallDialPad(String phoneNumber);

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to mute the ongoing call.
     */
    void muteCall();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to unmute the ongoing call.
     */
    void unmuteCall();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to change voice channel to handset/bluetooth.
     *
     * @param source to switch to.
     */
    void changeAudioSource(AudioSource source);

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to make a call to the first history from Call History.
     */
    void callMostRecentHistory();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used to get the contact name being called.
     */
    String getContactName();

    /**
     * Setup expectations: The app is open and there is an ongoing call
     *
     * <p>This method is used to get the contact type (Mobile, Work, Home and etc.) being called.
     */
    String getContactType();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to search a contact in the contact list.
     *
     * @param contact to search.
     */
    void searchContactsByName(String contact);

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to search a number in the contact list.
     *
     * @param number to search.
     */
    void searchContactsByNumber(String number);

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to get the first search result for contact.
     */
    String getFirstSearchResult();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to order the contact list based on first/last name.
     *
     * @param orderType to use.
     */
    void sortContactListBy(OrderType orderType);

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to get the first contact name from contact list.
     */
    String getFirstContactFromContactList();

    /**
     * Setup expectations: A Contact details page is open.
     *
     * <p>This method is used to get the home address from the currently-open contact.
     */
    String getHomeAddress();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to verify if a contact is added to Favorites.
     *
     * @param contact to check.
     */
    boolean isContactInFavorites(String contact);

    /**
     * Setup expectations: The contact's details page is open.
     *
     * <p>This method is used to close the details page.
     *
     * @param contact Contact's details page to be opened.
     */
    void openDetailsPage(String contact);

    /** Setup expectations: The dialer main page is open. Opens the dial pad screen. */
    void openDialPad();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to check if phone is paired.
     */
    boolean isPhonePaired();
    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to open contact list
     */
    void openContacts();

    /**
     * Setup expectations: The contacts page is open.
     *
     * <p>This method is used to open the contact details page of the first visible contact. Throws
     * an error if no contacts are visible.
     */
    void openFirstContactDetails();

    /**
     * Setup expectations: The app is open and there is an ongoing call.
     *
     * <p>This method is used check if ongoing call is displayed on home.
     */
    boolean isOngoingCallDisplayedOnHome();

    /**
     * Setup expectations: The home screen is open
     *
     * <p>This method is used for opening phone app from homescreen
     */
    void openPhoneAppFromHome();

    /**
     * Setup expectations: The app is open.
     *
     * <p>This method is used to get visible contacts list
     */
    List<String> getListOfAllVisibleContacts();

    /**
     * Setup expectations: The call history view is open.
     *
     * @return - The number of call histrory entries currently on screen.
     */
    int getNumberOfCallHistoryEntries();

    /**
     * Setup expectations: bluetooth is off
     *
     * <p>This method is used for checking if error message is displaye when bluetooth is off
     */
    boolean isBluetoothHfpErrorDisplayed();

    /**
     * Setup expectations: The app is open
     *
     * <p>This method is adding favorites from the Favorites Tab
     */
    void addFavoritesFromFavoritesTab(String contact);
    /**
     * Setup expectations: The bluetooth palette is open
     *
     * <p>This method is used for clicking phone button from bluetooth palette
     */
    void clickPhoneButton();
    /**
     * Setup expectations: The dialer page is open
     *
     * <p>This method is used to check if Recents tab is present in dialer page
     */
    boolean verifyDialerRecentsTab();
    /**
     * Setup expectations: The dialer page is open
     *
     * <p>This method is used to check if Contacts tab is present in dialer page
     */
    boolean verifyDialerContactsTab();
    /**
     * Setup expectations: The dialer page is open
     *
     * <p>This method is used to check if Favorites tab is present in dialer page
     */
    boolean verifyDialerFavoritesTab();
    /**
     * Setup expectations: The dialer page is open
     *
     * <p>This method is used to check if Dialpad tab is present in dialer page
     */
    boolean verifyDialerDialpadTab();
}
