/**
 * Copyright (C) 2010-2012 Regis Montoya (aka r3gis - www.r3gis.fr)
 * Copyright (C) 2004-2012 Savoir-Faire Linux Inc.
 *
 *  Author: Alexandre Savard <alexandre.savard@savoirfairelinux.com>
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 3 of the License, or
 *  (at your option) any later version.
 *  If you own a pjsip commercial license you can also redistribute it
 *  and/or modify it under the terms of the GNU Lesser General Public License
 *  as an android library.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>.
 */
package org.sflphone.service;

import android.content.Context;
import android.content.Intent;
import android.support.v4.content.LocalBroadcastManager;

public class ConfigurationManagerCallback extends ConfigurationCallback {
//    private static final String TAG = "ConfigurationManagerCallback";
    private Context mContext;

    static public final String SIGNAL_NAME = "signal-name";
    static public final String ACCOUNTS_CHANGED = "accounts-changed";
    static public final String ACCOUNT_STATE_CHANGED = "account-state-changed";

    public ConfigurationManagerCallback(Context context) {
        mContext = context;
    }

    @Override
    public void on_accounts_changed() {
        sendAccountsChangedMessage();
    }

    @Override
    public void on_account_state_changed(String accoundID, int state) {
        String strState = "";
        switch (state){
        case 0:
            strState = "UNREGISTERED";
            break;
        case 1:
            strState = "TRYING";
            break;
        case 2:
            strState = "REGISTERED";
            break;
        case 3:
            strState = "ERROR_GENERIC";
            break;
        case 4:
            strState = "ERROR_AUTH";
            break;
        case 5:
            strState = "ERROR_NETWORK";
            break;
        case 6:
            strState = "ERROR_HOST";
            break;
        case 7:
            strState = "ERROR_EXIST_STUN";
            break;
        case 8:
            strState = "ERROR_NOT_ACCEPTABLE";
            break;
        case 9:
            strState = "NUMBER_OF_STATES";
            break;
        }
        

        sendAccountsStateChangedMessage(accoundID, strState, 0);
    }
    
    @Override
    public void on_account_state_changed_with_code(String accoundID, String state, int code) {
        sendAccountsStateChangedMessage(accoundID, state, code);
    }

    private void sendAccountsStateChangedMessage(String accoundID, String state, int code) {
        Intent intent = new Intent(ACCOUNT_STATE_CHANGED);
        intent.putExtra("Account", accoundID);
        intent.putExtra("state", state);
        intent.putExtra("code", code);
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
    }

    private void sendAccountsChangedMessage() {
        Intent intent = new Intent(ACCOUNTS_CHANGED);
        LocalBroadcastManager.getInstance(mContext).sendBroadcast(intent);
    }

}
