package com.zhou.android.bluetooth;

import android.content.Context;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v4.util.ArrayMap;
import android.text.TextUtils;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.view.inputmethod.InputMethodManager;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.ListView;
import android.widget.TextView;

import com.zhou.android.R;
import com.zhou.android.common.CommonAdapter;
import com.zhou.android.common.ViewHolder;

import java.util.ArrayList;
import java.util.List;

/**
 * Bluetooth 蓝牙对话界面
 * Created by ZhOu on 2017/6/15.
 */

public class BluetoothChatFragment extends Fragment {

    private ListView listView;
    private EditText editText;

    private ArrayMap<String, List<ArrayMap<String, Object>>> allChatData = new ArrayMap<>();
    private List<ArrayMap<String, Object>> chatData = new ArrayList<>();
    private CommonAdapter<ArrayMap<String, Object>> chatAdapter;
    private InputMethodManager imm;

//    @Override
//    public void onResume() {
//        super.onResume();
//        if (editText != null) {
//            editText.setFocusable(true);
//            editText.setFocusableInTouchMode(true);
//            editText.requestFocus();
//        }
//    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.fragment_bluetooth_chat, container, false);
    }

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

        imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE);

        listView = (ListView) view.findViewById(R.id.listView);
        editText = (EditText) view.findViewById(R.id.editText);
        chatAdapter = new CommonAdapter<ArrayMap<String, Object>>(getActivity(), chatData, R.layout.listformat_bluetooth_chat) {
            @Override
            protected void fillData(ViewHolder holder, int position) {
                TextView tv = holder.getView(R.id.tv_chat);
                ArrayMap<String, Object> map = chatData.get(position);
                int type = (int) map.get("type");
                LinearLayout.LayoutParams lp = (LinearLayout.LayoutParams) tv.getLayoutParams();
                lp.gravity = type == 0 ? Gravity.START : Gravity.END;
                tv.setLayoutParams(lp);
                tv.setBackgroundResource(type == 0 ? R.drawable.ic_chat_left : R.drawable.ic_chat_right);
                tv.setText((String) map.get("text"));
            }
        };
        listView.setAdapter(chatAdapter);
        editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_SEND) {
                    String msg = v.getText().toString();
                    if (TextUtils.isEmpty(msg))
                        return true;
                    writeMessage(msg);
                    if (onSendMessageListener != null) {
                        onSendMessageListener.sendMessage(msg);
                    }
                    v.setText("");
                    return true;
                } else
                    return false;
            }
        });
        listView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN && imm != null && imm.isActive()) {
                    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
                return false;
            }
        });
    }

    private String currentAddress;

    public void setDeviceAddress(String address) {
        currentAddress = address;
    }

    @Override
    public void onHiddenChanged(boolean hidden) {
        super.onHiddenChanged(hidden);
        if (hidden) {
            List<ArrayMap<String, Object>> tmp = allChatData.get(currentAddress);
            if (tmp == null)
                tmp = new ArrayList<>();
            else
                tmp.clear();
            tmp.addAll(chatData);
            allChatData.put(currentAddress, tmp);
        } else {
            List<ArrayMap<String, Object>> tmp = allChatData.get(currentAddress);
            chatData.clear();
            if (tmp != null) {
                chatData.addAll(tmp);
            }
            chatAdapter.notifyDataSetChanged();
        }
    }

    /**
     * 接收对方消息
     *
     * @param message
     */
    public void pushMessage(String message) {
        if (TextUtils.isEmpty(message))
            return;
        ArrayMap<String, Object> am = new ArrayMap<>();
        am.put("type", 0);
        am.put("text", message);
        chatData.add(am);
        chatAdapter.notifyDataSetChanged();
    }

    /**
     * 写发送给对方消息
     *
     * @param message
     */
    private void writeMessage(String message) {
        ArrayMap<String, Object> am = new ArrayMap<>();
        am.put("type", 1);
        am.put("text", message);
        chatData.add(am);
        chatAdapter.notifyDataSetChanged();
    }

    private OnSendMessageListener onSendMessageListener;

    public void setOnSendMessageListener(OnSendMessageListener onSendMessageListener) {
        this.onSendMessageListener = onSendMessageListener;
    }

    public interface OnSendMessageListener {
        void sendMessage(String message);
    }
}