/*
 * Copyright (C) 2017 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 com.android.car.messenger;

import android.bluetooth.BluetoothDevice;
import android.bluetooth.BluetoothMapClient;
import android.content.Intent;

import androidx.annotation.Nullable;

/**
 * Represents a message obtained via MAP service from a connected Bluetooth device.
 */
class MapMessage {
    private BluetoothDevice mDevice;
    private String mHandle;
    private long mReceivedTimeMs;
    private String mSenderName;
    @Nullable
    private String mSenderContactUri;
    private String mText;

    /**
     * Constructs Message from {@code intent} that was received from MAP service via
     * {@link BluetoothMapClient#ACTION_MESSAGE_RECEIVED} broadcast.
     *
     * @param intent Intent received from MAP service.
     * @return Message constructed from extras in {@code intent}.
     * @throws IllegalArgumentException If {@code intent} is missing any required fields.
     */
    public static MapMessage parseFrom(Intent intent) {
        BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
        String handle = intent.getStringExtra(BluetoothMapClient.EXTRA_MESSAGE_HANDLE);
        String senderContactUri = intent.getStringExtra(
                BluetoothMapClient.EXTRA_SENDER_CONTACT_URI);
        String senderContactName = intent.getStringExtra(
                BluetoothMapClient.EXTRA_SENDER_CONTACT_NAME);
        String text = intent.getStringExtra(android.content.Intent.EXTRA_TEXT);
        return new MapMessage(device, handle, System.currentTimeMillis(), senderContactName,
                senderContactUri, text);
    }

    private MapMessage(BluetoothDevice device,
            String handle,
            long receivedTimeMs,
            String senderName,
            @Nullable String senderContactUri,
            String text) {
        boolean missingDevice = (device == null);
        boolean missingHandle = (handle == null);
        boolean missingSenderName = (senderName == null);
        boolean missingText = (text == null);
        if (missingDevice || missingHandle || missingText) {
            StringBuilder builder = new StringBuilder("Missing required fields:");
            if (missingDevice) {
                builder.append(" device");
            }
            if (missingHandle) {
                builder.append(" handle");
            }
            if (missingSenderName) {
                builder.append(" senderName");
            }
            if (missingText) {
                builder.append(" text");
            }
            throw new IllegalArgumentException(builder.toString());
        }
        mDevice = device;
        mHandle = handle;
        mReceivedTimeMs = receivedTimeMs;
        mText = text;
        mSenderContactUri = senderContactUri;
        mSenderName = senderName;
    }

    public BluetoothDevice getDevice() {
        return mDevice;
    }

    /**
     * @return Unique handle for this message. NOTE: The handle is only required to be unique for
     *      the lifetime of a single MAP session.
     */
    public String getHandle() {
        return mHandle;
    }

    /**
     * @return Milliseconds since epoch at which this message notification was received on the head-
     *      unit.
     */
    public long getReceivedTimeMs() {
        return mReceivedTimeMs;
    }

    /**
     * @return Contact name as obtained from the device. If contact is in the device's address-book,
     *       this is typically the contact name. Otherwise it will be the phone number.
     */
    public String getSenderName() {
        return mSenderName;
    }

    /**
     * @return Sender phone number available as a URI string. iPhone's don't provide these.
     */
    @Nullable
    public String getSenderContactUri() {
        return mSenderContactUri;
    }

    /**
     * @return Actual content of the message.
     */
    public String getText() {
        return mText;
    }

    @Override
    public String toString() {
        return "MapMessage{" +
                "mDevice=" + mDevice +
                ", mHandle='" + mHandle + '\'' +
                ", mReceivedTimeMs=" + mReceivedTimeMs +
                ", mText='" + mText + '\'' +
                ", mSenderContactUri='" + mSenderContactUri + '\'' +
                ", mSenderName='" + mSenderName + '\'' +
                '}';
    }
}
