package com.fourteenelevendev.android.apps.ioexperiment.ui;

import android.content.Context;
import android.graphics.Typeface;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentActivity;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.Spinner;
import android.widget.TextView;

import com.afollestad.materialdialogs.DialogAction;
import com.afollestad.materialdialogs.MaterialDialog;

import com.fourteenelevendev.android.apps.ioexperiment.R;
import com.fourteenelevendev.android.apps.ioexperiment.utils.Constants;
import com.fourteenelevendev.android.apps.ioexperiment.utils.DialogUtils;
import com.fourteenelevendev.android.apps.ioexperiment.utils.PreferencesUtils;

/**
 * Connect the devices
 *
 * Created by kyleparker on 3/30/2016.
 */
public class ConnectFragment extends Fragment {
    private FragmentActivity mActivity;
    private ViewGroup mRootView;
    private Spinner mSpinner;

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

        mActivity = this.getActivity();
    }

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        mRootView = (ViewGroup) inflater.inflate(R.layout.fragment_connect, container, false);
        mRootView.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));

        return mRootView;
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);

        setupView();
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (!(context instanceof Callbacks)) {
            throw new ClassCastException(context.toString() + " must implement " + ConnectFragment.class.getSimpleName());
        }

        mCallbacks = (Callbacks) context;
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mCallbacks = sDummyCallbacks;
    }

    /**
     * Set up the various views within the fragment.
     * Set typeface, content, images, set event listeners, and generate adapter for the quantity dropdown
     */
    private void setupView() {
        Typeface typeface = Typeface.createFromAsset(mActivity.getAssets(), Constants.APP_FONT);
        TextView introConnect = (TextView)mRootView.findViewById(R.id.intro_connect);
        introConnect.setTypeface(typeface);

        TextView introDevices = (TextView)mRootView.findViewById(R.id.intro_number_devices);
        introDevices.setTypeface(typeface);

        CharSequence[] items = new CharSequence[11];
        for (int i = 0; i < 11; i++) {
            items[i] = Integer.toString(i + 1);
        }

        mSpinner = (Spinner) mRootView.findViewById(R.id.spinner_devices);
        // Create an ArrayAdapter using the string array and a default spinner layout
        ArrayAdapter<CharSequence> adapter = new ArrayAdapter<>(mActivity, R.layout.spinner_item, items);
        adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item);
        mSpinner.setAdapter(adapter);
        mSpinner.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() {
            @Override
            public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
                PreferencesUtils.setInt(mActivity, R.string.key_total_devices, position + 1);
            }

            @Override
            public void onNothingSelected(AdapterView<?> parent) {
            }
        });
        mSpinner.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                MainActivity.hide();
                return false;
            }
        });

        Button letsGo = (Button) mRootView.findViewById(R.id.button_lets_go);
        letsGo.setOnClickListener(mClickListener);
    }

    /**
     * Handle the click listener for the text/button
     */
    private View.OnClickListener mClickListener = new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            MainActivity.hide();

            if (mSpinner.getSelectedItemPosition() == 0) {
                MaterialDialog.SingleButtonCallback negativeCallback = new MaterialDialog.SingleButtonCallback() {
                    @Override
                    public void onClick(@NonNull MaterialDialog dialog, @NonNull DialogAction which) {
                        PreferencesUtils.setBoolean(mActivity, R.string.key_is_connected, true);
                        mCallbacks.onLetsGo();
                    }
                };

                DialogUtils.createDialog(mActivity, DialogUtils.DEFAULT_TITLE_ID, R.string.dialog_single_device,
                        R.string.dialog_i_found_one, R.string.dialog_nope_just_one, true, null, negativeCallback).show();
            } else {
                mCallbacks.onLetsGo();
            }
        }
    };

    /**
     * Callbacks
     */
    public interface Callbacks {
        void onLetsGo();
    }

    private static Callbacks sDummyCallbacks = new Callbacks() {
        @Override
        public void onLetsGo() {
        }
    };

    private Callbacks mCallbacks = sDummyCallbacks;
}