/*
 * Copyright (C) 2007 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.internal.telephony.gsm;

import android.telephony.PhoneNumberUtils;

import java.util.Arrays;

/**
 * Represents a Supplementary Service Notification received from the network.
 *
 * @hide
 */
public class SuppServiceNotification {
    /** Type of notification: 0 = code1; 1 = code2 */
    public int notificationType;
    /** TS 27.007 7.17 "code1" or "code2" */
    public int code;
    /** TS 27.007 7.17 "index" */
    public int index;
    /** TS 27.007 7.17 "type" (MT only) */
    public int type;
    /** TS 27.007 7.17 "number" (MT only) */
    public String number;

    /** List of forwarded numbers, if any */
    public String[] history;

    /**
     * Notification type is from the "code 1" group (per TS 27.007 7.17).
     * This means the {@link #code} will be a code such as {@link #CODE_1_CALL_FORWARDED}.
     */
    public static final int NOTIFICATION_TYPE_CODE_1 = 0;

    /**
     * Notification type is from the "code 2" group (per TS 27.007 7.17).
     * This means the {@link #code} will be a code such as {@link #CODE_2_CALL_ON_HOLD}.
     */
    public static final int NOTIFICATION_TYPE_CODE_2 = 1;

    /**
     * Indicates that unconditional call forwarding is active.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_UNCONDITIONAL_CF_ACTIVE     = 0;

    /**
     * Indicates that some conditional call forwarding options are active.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_SOME_CF_ACTIVE              = 1;

    /**
     * Indicates that an outgoing call has been forwarded to another number.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_CALL_FORWARDED              = 2;

    /**
     * Indicates that an outgoing call is waiting.  This means that the called party is already in
     * another call and is hearing the call waiting tone.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_CALL_IS_WAITING             = 3;

    /**
     * Indicates that an outgoing call is to a number in a closed user group.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_CUG_CALL                    = 4;

    /**
     * Indicates that outgoing calls are barred.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_OUTGOING_CALLS_BARRED       = 5;

    /**
     * Indicates that incoming calls are barred.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_INCOMING_CALLS_BARRED       = 6;

    /**
     * Indicates that CLIR suppression has been rejected for an outgoing call.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_CLIR_SUPPRESSION_REJECTED   = 7;

    /**
     * Indicates that an outgoing call bas been deflected to another number.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_1}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_1_CALL_DEFLECTED              = 8;

    /**
     * Indicates that an incoming call is a forwarded call.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_FORWARDED_CALL              = 0;

    /**
     * Indicates that an incoming call is from a member of a closed user group.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_CUG_CALL                    = 1;

    /**
     * Indicates that a call has been remotely put on hold.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_CALL_ON_HOLD                = 2;

    /**
     * Indicates that a call has been remotely resumed (retrieved).
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_CALL_RETRIEVED              = 3;

    /**
     * Indicates that a conference call has been entered.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_MULTI_PARTY_CALL            = 4;

    /**
     * Indicates that an ongoing call on hold has been released.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_ON_HOLD_CALL_RELEASED       = 5;

    /**
     * Indicates that a forward check message was received.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_FORWARD_CHECK_RECEIVED      = 6;

    /**
     * Indicates that a call is being connected (alerting) with another party as a result of an
     * explicit call transfer operation.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_CALL_CONNECTING_ECT         = 7;

    /**
     * Indicates that a call has been connected with another party as a result of an explicit call
     * transfer operation.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_CALL_CONNECTED_ECT          = 8;

    /**
     * Indicates that an outgoing call has been deflected to another number.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_DEFLECTED_CALL              = 9;

    /**
     * Indicates that an additional incoming call has been forwarded.
     * Valid {@link #code} when {@link #type} is {@link #NOTIFICATION_TYPE_CODE_2}.
     * See TS 27.007 7.17.
     */
    public static final int CODE_2_ADDITIONAL_CALL_FORWARDED   = 10;

    @Override
    public String toString()
    {
        return super.toString() + " mobile"
            + (notificationType == 0 ? " originated " : " terminated ")
            + " code: " + code
            + " index: " + index
            + " history: " + Arrays.toString(history)
            + " \""
            + PhoneNumberUtils.stringFromStringAndTOA(number, type) + "\" ";
    }

}
