// Copyright 2016 The Vanadium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.

package examples.baku.io.permissions.discovery;

import android.app.Fragment;
import android.content.ComponentName;
import android.content.Intent;
import android.content.ServiceConnection;
import android.os.Bundle;
import android.os.IBinder;
import android.support.v7.app.AppCompatActivity;

import java.util.Map;

import examples.baku.io.permissions.PermissionService;
import examples.baku.io.permissions.R;
import examples.baku.io.permissions.examples.ComposeActivity;
import examples.baku.io.permissions.util.EventFragment;

public class DevicePickerActivity extends AppCompatActivity implements EventFragment.EventFragmentListener, ServiceConnection {

    private PermissionService mPermissionService;
    private Map<String, DeviceData> mDevices;
    private DevicePickerActivityFragment mFragment;

    private int requestCode;
    public static final int REQUEST_FOCUS = -1;
    public static final int REQUEST_DEVICE_ID = 2;
    public static final String EXTRA_REQUEST = "requestCode";
    public static final String EXTRA_DEVICE_ID = "requestCode";
    public static final String EXTRA_REQUEST_ARGS = "requestArgs";

    private Intent mIntent;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        sendBroadcast(new Intent(Intent.ACTION_CLOSE_SYSTEM_DIALOGS));  //close notification tray
        setContentView(R.layout.content_device_picker);

        Intent intent = getIntent();
        if(intent != null){
            requestCode = intent.getIntExtra(EXTRA_REQUEST, REQUEST_FOCUS);
        }

        mIntent = getIntent();
        PermissionService.bind(this);
    }

    @Override
    public void onAttachFragment(Fragment fragment) {
        super.onAttachFragment(fragment);
        mFragment = (DevicePickerActivityFragment)fragment;
        mFragment.setDevices(mDevices);
    }

    @Override
    public boolean onFragmentEvent(int action, Bundle args, EventFragment fragment) {
        switch(action){
            case DevicePickerActivityFragment.EVENT_ITEMCLICKED:
                String dId = args.getString(DevicePickerActivityFragment.ARG_DEVICE_ID);
                if(dId != null){
                    if(requestCode == REQUEST_DEVICE_ID){
                        Intent result = new Intent();
                        result.putExtra(EXTRA_DEVICE_ID,dId);
                        if(mIntent != null && mIntent.hasExtra(EXTRA_REQUEST_ARGS))
                        {
                            result.putExtra(EXTRA_REQUEST_ARGS, mIntent.getStringExtra(EXTRA_REQUEST_ARGS));
                        }
                        setResult(0, result);
                    }else{
                        mPermissionService.setFocus(dId);
                    }
                    finish();
                    return true;
                }
                break;
        }
        return false;
    }

    @Override
    public void onServiceConnected(ComponentName name, IBinder service) {
        mPermissionService = ((PermissionService.PermissionServiceBinder)service).getInstance();
        mDevices = mPermissionService.getDiscovered();
        if(mFragment != null){
            mFragment.setDevices(mDevices);
        }
        mPermissionService.addDiscoveryListener(new PermissionService.DiscoveryListener() {
            @Override
            public void onChange(Map<String, DeviceData> devices) {
                if(mFragment != null){
                    mFragment.setDevices(mDevices);
                }
            }

            @Override
            public void onDisassociate(String deviceId) {

            }
        });
    }

    @Override
    public void onServiceDisconnected(ComponentName name) {

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unbindService(this);
    }
}
