/*
 * Copyright 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 com.android.bluetooth.hfp;

import java.util.Objects;

/**
 * A blob of data representing an overall call state on the phone
 */
class HeadsetCallState extends HeadsetMessageObject {
    /**
     * Number of active calls
     */
    int mNumActive;
    /**
     * Number of held calls
     */
    int mNumHeld;
    /**
     * Current call setup state as defined in bthf_call_state_t of bt_hf.h or
     * {@link com.android.server.telecom.BluetoothPhoneServiceImpl} or {@link HeadsetHalConstants}
     */
    int mCallState;
    /**
     * Currently active call's phone number
     */
    String mNumber;
    /**
     * Phone number type
     */
    int mType;
    /**
     * Caller display name
     */
    String mName;

    HeadsetCallState(int numActive, int numHeld, int callState, String number, int type,
            String name) {
        mNumActive = numActive;
        mNumHeld = numHeld;
        mCallState = callState;
        mNumber = number;
        mType = type;
        mName = name;
    }

    @Override
    public void buildString(StringBuilder builder) {
        if (builder == null) {
            return;
        }
        builder.append(this.getClass().getSimpleName())
                .append("[numActive=")
                .append(mNumActive)
                .append(", numHeld=")
                .append(mNumHeld)
                .append(", callState=")
                .append(mCallState)
                .append(", number=");
        if (mNumber == null) {
            builder.append("null");
        } else {
            builder.append("***");
        }
        builder.append(", type=").append(mType).append(", name=");
        if (mName == null) {
            builder.append("null");
        } else {
            builder.append("***");
        }
        builder.append("]");
    }

    @Override
    public boolean equals(Object object) {
        if (this == object) {
            return true;
        }
        if (!(object instanceof HeadsetCallState)) {
            return false;
        }
        HeadsetCallState that = (HeadsetCallState) object;
        return mNumActive == that.mNumActive && mNumHeld == that.mNumHeld
                && mCallState == that.mCallState && Objects.equals(mNumber, that.mNumber)
                && mType == that.mType && Objects.equals(mName, that.mName);
    }

    @Override
    public int hashCode() {
        return Objects.hash(mNumActive, mNumHeld, mCallState, mNumber, mType, mName);
    }
}
