/*
 *
 *   Copyright (C) 2020, University of the Basque Country (UPV/EHU)
 *
 *  Contact for licensing options: <licensing-mcpttclient(at)mcopenplatform(dot)com>
 *
 *  This file is part of MCOP MCPTT Client
 *
 *  This 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.
 *
 *  This 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, write to the Free Software Foundation, Inc.,
 *  59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
 */

package org.mcopenplatform.muoapi;

import android.content.Context;
import android.content.Intent;
import android.os.IBinder;
import android.util.Log;

import org.mcopenplatform.muoapi.utils.Utils;

import java.util.ArrayList;


public class Engine {

    private final static String TAG = Utils.getTAG(Engine.class.getCanonicalName());
    private static Engine sInstance;
    private static ArrayList<ManagerClient> mClients;
    private static int NUM_MAX_CLIENT=1;

    public static Engine getInstance(){
        if(sInstance == null){
            sInstance = new Engine();
        }
        return sInstance;
    }

    public Engine() {
        mClients=new ArrayList<>();
        Log.d(TAG,"Start engine SDK MCOP");
    }

    protected IBinder newClient(Intent intent,Context context,boolean isRebind){
        IBinder result=null;
        ManagerClient managerClient=null;
        if(mClients.size()==NUM_MAX_CLIENT){
            managerClient=mClients.get(0);
        }if(mClients.size()<NUM_MAX_CLIENT){
            Log.d(TAG,"Create new client");

            String connectivityPluginPackageMain  = intent.getStringExtra(ConstantsMCOP.CONNECTIVITY_PLUGIN_PACKAGE_ID);
            String connectivityPluginPackageService = intent.getStringExtra(ConstantsMCOP.CONNECTIVITY_PLUGIN_SERVICE_ID);
            String simPluginPackageMain  = intent.getStringExtra(ConstantsMCOP.SIM_PLUGIN_PACKAGE_ID);
            String simPluginPackageService = intent.getStringExtra(ConstantsMCOP.SIM_PLUGIN_SERVICE_ID);
            String configurationPluginPackageMain  = intent.getStringExtra(ConstantsMCOP.CONFIGURATION_PLUGIN_PACKAGE_ID);
            String configurationPluginPackageService = intent.getStringExtra(ConstantsMCOP.CONFIGURATION_PLUGIN_SERVICE_ID);
            String mbmsPluginPackageMain = intent.getStringExtra(ConstantsMCOP.MBMS_PLUGIN_PACKAGE_ID);
            String mbmsPluginPackageService = intent.getStringExtra(ConstantsMCOP.MBMS_PLUGIN_SERVICE_ID);
            managerClient=new ManagerClient(context
            ,connectivityPluginPackageService
            ,connectivityPluginPackageMain
            ,simPluginPackageService
            ,simPluginPackageMain
            ,configurationPluginPackageService
            ,configurationPluginPackageMain
            ,mbmsPluginPackageService
            ,mbmsPluginPackageMain
            );
            mClients.add(managerClient);

        }else{
            Log.e(TAG,"The number of users of the server to exceeded the allowed maximum number");
        }

        //Test
        //Only in demo
        String userSelect=null;
        if(managerClient!=null && (userSelect=intent.getStringExtra("PROFILE_SELECT"))!=null && !userSelect.trim().isEmpty()){
            Log.d(TAG,"Select profile:"+userSelect);
            managerClient.selectProfileMCOP2(userSelect);
        }
        if(managerClient!=null)
        result=managerClient.startManagerClient(isRebind);
        return result;
    }

    public boolean stopClients(){
        boolean success=false;
        if(mClients!=null){
            success=true;
            for(ManagerClient managerClient:mClients){
                success &=managerClient.stopManagerClient();
                //mClients.remove(managerClient);
            }
        }
        return success;
    }

    public boolean onDestroyClients(){
        boolean success=false;
        if(mClients!=null){
            success=true;
            for(ManagerClient managerClient:mClients){
                success &=managerClient.onDestroyClient();
                //mClients.remove(managerClient);
            }
        }
        return success;
    }




}