/*
 * Copyright (C) 2018 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.telephony.ims.aidl;

import android.net.Uri;
import android.telephony.ims.RcsEventQueryParams;
import android.telephony.ims.RcsEventQueryResultDescriptor;
import android.telephony.ims.RcsFileTransferCreationParams;
import android.telephony.ims.RcsIncomingMessageCreationParams;
import android.telephony.ims.RcsMessageSnippet;
import android.telephony.ims.RcsMessageQueryParams;
import android.telephony.ims.RcsMessageQueryResultParcelable;
import android.telephony.ims.RcsOutgoingMessageCreationParams;
import android.telephony.ims.RcsParticipantQueryParams;
import android.telephony.ims.RcsParticipantQueryResultParcelable;
import android.telephony.ims.RcsQueryContinuationToken;
import android.telephony.ims.RcsThreadQueryParams;
import android.telephony.ims.RcsThreadQueryResultParcelable;

/**
 * RPC definition between RCS storage APIs and phone process.
 * {@hide}
 */
interface IRcsMessage {
    /////////////////////////
    // RcsMessageStore APIs
    /////////////////////////
    RcsThreadQueryResultParcelable getRcsThreads(in RcsThreadQueryParams queryParams, String callingPackage);

    RcsThreadQueryResultParcelable getRcsThreadsWithToken(
        in RcsQueryContinuationToken continuationToken, String callingPackage);

    RcsParticipantQueryResultParcelable getParticipants(in RcsParticipantQueryParams queryParams, String callingPackage);

    RcsParticipantQueryResultParcelable getParticipantsWithToken(
        in RcsQueryContinuationToken continuationToken, String callingPackage);

    RcsMessageQueryResultParcelable getMessages(in RcsMessageQueryParams queryParams, String callingPackage);

    RcsMessageQueryResultParcelable getMessagesWithToken(
        in RcsQueryContinuationToken continuationToken, String callingPackage);

    RcsEventQueryResultDescriptor getEvents(in RcsEventQueryParams queryParams, String callingPackage);

    RcsEventQueryResultDescriptor getEventsWithToken(
        in RcsQueryContinuationToken continuationToken, String callingPackage);

    // returns true if the thread was successfully deleted
    boolean deleteThread(int threadId, int threadType, String callingPackage);

    // Creates an Rcs1To1Thread and returns its row ID
    int createRcs1To1Thread(int participantId, String callingPackage);

    // Creates an RcsGroupThread and returns its row ID
    int createGroupThread(in int[] participantIds, String groupName, in Uri groupIcon, String callingPackage);

    /////////////////////////
    // RcsThread APIs
    /////////////////////////

    // Creates a new RcsIncomingMessage on the given thread and returns its row ID
    int addIncomingMessage(int rcsThreadId,
            in RcsIncomingMessageCreationParams rcsIncomingMessageCreationParams, String callingPackage);

    // Creates a new RcsOutgoingMessage on the given thread and returns its row ID
    int addOutgoingMessage(int rcsThreadId,
            in RcsOutgoingMessageCreationParams rcsOutgoingMessageCreationParams, String callingPackage);

    // TODO: modify RcsProvider URI's to allow deleting a message without specifying its thread
    void deleteMessage(int rcsMessageId, boolean isIncoming, int rcsThreadId, boolean isGroup, String callingPackage);

    RcsMessageSnippet getMessageSnippet(int rcsThreadId, String callingPackage);

    /////////////////////////
    // Rcs1To1Thread APIs
    /////////////////////////
    void set1To1ThreadFallbackThreadId(int rcsThreadId, long fallbackId, String callingPackage);

    long get1To1ThreadFallbackThreadId(int rcsThreadId, String callingPackage);

    int get1To1ThreadOtherParticipantId(int rcsThreadId, String callingPackage);

    /////////////////////////
    // RcsGroupThread APIs
    /////////////////////////
    void setGroupThreadName(int rcsThreadId, String groupName, String callingPackage);

    String getGroupThreadName(int rcsThreadId, String callingPackage);

    void setGroupThreadIcon(int rcsThreadId, in Uri groupIcon, String callingPackage);

    Uri getGroupThreadIcon(int rcsThreadId, String callingPackage);

    void setGroupThreadOwner(int rcsThreadId, int participantId, String callingPackage);

    int getGroupThreadOwner(int rcsThreadId, String callingPackage);

    void setGroupThreadConferenceUri(int rcsThreadId, in Uri conferenceUri, String callingPackage);

    Uri getGroupThreadConferenceUri(int rcsThreadId, String callingPackage);

    void addParticipantToGroupThread(int rcsThreadId, int participantId, String callingPackage);

    void removeParticipantFromGroupThread(int rcsThreadId, int participantId, String callingPackage);

    /////////////////////////
    // RcsParticipant APIs
    /////////////////////////

    // Creates a new RcsParticipant and returns its rowId
    int createRcsParticipant(String canonicalAddress, String alias, String callingPackage);

    String getRcsParticipantCanonicalAddress(int participantId, String callingPackage);

    String getRcsParticipantAlias(int participantId, String callingPackage);

    void setRcsParticipantAlias(int id, String alias, String callingPackage);

    String getRcsParticipantContactId(int participantId, String callingPackage);

    void setRcsParticipantContactId(int participantId, String contactId, String callingPackage);

    /////////////////////////
    // RcsMessage APIs
    /////////////////////////
    void setMessageSubId(int messageId, boolean isIncoming, int subId, String callingPackage);

    int getMessageSubId(int messageId, boolean isIncoming, String callingPackage);

    void setMessageStatus(int messageId, boolean isIncoming, int status, String callingPackage);

    int getMessageStatus(int messageId, boolean isIncoming, String callingPackage);

    void setMessageOriginationTimestamp(int messageId, boolean isIncoming, long originationTimestamp, String callingPackage);

    long getMessageOriginationTimestamp(int messageId, boolean isIncoming, String callingPackage);

    void setGlobalMessageIdForMessage(int messageId, boolean isIncoming, String globalId, String callingPackage);

    String getGlobalMessageIdForMessage(int messageId, boolean isIncoming, String callingPackage);

    void setMessageArrivalTimestamp(int messageId, boolean isIncoming, long arrivalTimestamp, String callingPackage);

    long getMessageArrivalTimestamp(int messageId, boolean isIncoming, String callingPackage);

    void setMessageSeenTimestamp(int messageId, boolean isIncoming, long seenTimestamp, String callingPackage);

    long getMessageSeenTimestamp(int messageId, boolean isIncoming, String callingPackage);

    void setTextForMessage(int messageId, boolean isIncoming, String text, String callingPackage);

    String getTextForMessage(int messageId, boolean isIncoming, String callingPackage);

    void setLatitudeForMessage(int messageId, boolean isIncoming, double latitude, String callingPackage);

    double getLatitudeForMessage(int messageId, boolean isIncoming, String callingPackage);

    void setLongitudeForMessage(int messageId, boolean isIncoming, double longitude, String callingPackage);

    double getLongitudeForMessage(int messageId, boolean isIncoming, String callingPackage);

    // Returns the ID's of the file transfers attached to the given message
    int[] getFileTransfersAttachedToMessage(int messageId, boolean isIncoming, String callingPackage);

    int getSenderParticipant(int messageId, String callingPackage);

    /////////////////////////
    // RcsOutgoingMessageDelivery APIs
    /////////////////////////

    // Returns the participant ID's that this message is intended to be delivered to
    int[] getMessageRecipients(int messageId, String callingPackage);

    long getOutgoingDeliveryDeliveredTimestamp(int messageId, int participantId, String callingPackage);

    void setOutgoingDeliveryDeliveredTimestamp(int messageId, int participantId, long deliveredTimestamp, String callingPackage);

    long getOutgoingDeliverySeenTimestamp(int messageId, int participantId, String callingPackage);

    void setOutgoingDeliverySeenTimestamp(int messageId, int participantId, long seenTimestamp, String callingPackage);

    int getOutgoingDeliveryStatus(int messageId, int participantId, String callingPackage);

    void setOutgoingDeliveryStatus(int messageId, int participantId, int status, String callingPackage);

    /////////////////////////
    // RcsFileTransferPart APIs
    /////////////////////////

    // Performs the initial write to storage and returns the row ID.
    int storeFileTransfer(int messageId, boolean isIncoming,
            in RcsFileTransferCreationParams fileTransferCreationParams, String callingPackage);

    void deleteFileTransfer(int partId, String callingPackage);

    void setFileTransferSessionId(int partId, String sessionId, String callingPackage);

    String getFileTransferSessionId(int partId, String callingPackage);

    void setFileTransferContentUri(int partId, in Uri contentUri, String callingPackage);

    Uri getFileTransferContentUri(int partId, String callingPackage);

    void setFileTransferContentType(int partId, String contentType, String callingPackage);

    String getFileTransferContentType(int partId, String callingPackage);

    void setFileTransferFileSize(int partId, long fileSize, String callingPackage);

    long getFileTransferFileSize(int partId, String callingPackage);

    void setFileTransferTransferOffset(int partId, long transferOffset, String callingPackage);

    long getFileTransferTransferOffset(int partId, String callingPackage);

    void setFileTransferStatus(int partId, int transferStatus, String callingPackage);

    int getFileTransferStatus(int partId, String callingPackage);

    void setFileTransferWidth(int partId, int width, String callingPackage);

    int getFileTransferWidth(int partId, String callingPackage);

    void setFileTransferHeight(int partId, int height, String callingPackage);

    int getFileTransferHeight(int partId, String callingPackage);

    void setFileTransferLength(int partId, long length, String callingPackage);

    long getFileTransferLength(int partId, String callingPackage);

    void setFileTransferPreviewUri(int partId, in Uri uri, String callingPackage);

    Uri getFileTransferPreviewUri(int partId, String callingPackage);

    void setFileTransferPreviewType(int partId, String type, String callingPackage);

    String getFileTransferPreviewType(int partId, String callingPackage);

    /////////////////////////
    // RcsEvent APIs
    /////////////////////////
    int createGroupThreadNameChangedEvent(long timestamp, int threadId, int originationParticipantId, String newName, String callingPackage);

    int createGroupThreadIconChangedEvent(long timestamp, int threadId, int originationParticipantId, in Uri newIcon, String callingPackage);

    int createGroupThreadParticipantJoinedEvent(long timestamp, int threadId, int originationParticipantId, int participantId, String callingPackage);

    int createGroupThreadParticipantLeftEvent(long timestamp, int threadId, int originationParticipantId, int participantId, String callingPackage);

    int createParticipantAliasChangedEvent(long timestamp, int participantId, String newAlias, String callingPackage);
}