package com.fxy.detection;

import android.annotation.SuppressLint;
import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.GridLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.DisplayMetrics;
import android.view.KeyEvent;
import android.view.View;
import android.view.ViewGroup;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;


import com.bumptech.glide.Glide;
import com.bumptech.glide.load.engine.DiskCacheStrategy;
import com.bumptech.glide.request.RequestOptions;
import com.chad.library.adapter.base.BaseQuickAdapter;
import com.chad.library.adapter.base.BaseViewHolder;
import com.elvishew.xlog.XLog;
import com.fxy.R;
import com.fxy.baselibrary.base.BaseActivity;
import com.fxy.baselibrary.bean.BaseEventBusBean;
import com.fxy.baselibrary.interfaces.OnRxScanerListener;
import com.fxy.baselibrary.qrcode.ActivityScanerCode;
import com.fxy.baselibrary.util.JsonUtil;
import com.fxy.bean.ActionBean;
import com.fxy.bean.ScanBean;
import com.fxy.common.ConfirmDialog;
import com.fxy.constant.BaseConfig;
import com.fxy.constant.EventCode;
import com.fxy.detection.bean.BtnInfoBean;
import com.fxy.detection.bean.BoxInfoBean;
import com.fxy.detection.bean.BoxSkuBean;
import com.fxy.detection.bean.ConfirmGoodsBean;
import com.fxy.net.MyDialogCallback;
import com.fxy.net.Urls;
import com.fxy.utils.ToolUtils;
import com.fxy.view.FloatingImageView;
import com.fxy.view.FullyGridLayoutManager;
import com.google.gson.Gson;
import com.google.zxing.Result;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;

import org.json.JSONObject;

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

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.Unbinder;
import sto.android.app.StoJNI;
import sto.android.app.StoPdaKeyEvent;
import sto.android.app.StoTongJNI;

public class DetectionConfirmGoodsMainActivity extends BaseActivity implements StoJNI.ScanCallBack {
    /**
     * 列表适配器
     */
    Context mContext = this;
    Activity mActivity = this;
    //单号
    @BindView(R.id.et_box_code)
    EditText etBoxCode;

    //单号
    @BindView(R.id.et_unit_code)
    EditText etUnitCode;


    @BindView(R.id.recyclerview)
    RecyclerView recyclerView;

    @BindView(R.id.ll_host_diff)
    LinearLayout llHostDiff;
    @BindView(R.id.ll_from)
    LinearLayout llFrom;


    //扫码扫码动作
    private ScanBean scanBean;

    //浮动按钮
    @BindView(R.id.iv_drag)
    FloatingImageView iv_drag;


    private View errorView;     //错误显示页
    private View emptyView;     //空显示页
    /**
     * 列表适配器
     */
    private FinishWorkAdapter mAdapter;

    private List<BoxSkuBean> boxSkuBeanList;

    private int currentSku = -1;

    private List<BtnInfoBean> listBtn = new ArrayList<>();

    private float density = 0;

    private ConfirmDialog confirmDialog;

    private Unbinder unbinder;
    

    @Override
    public int getContentViewResId() {
        return R.layout.activity_fxy_detection_confirm_goods;
    }

    @Override
    public boolean showToolBar() {
        return true;
    }

    @Override
    public boolean openEventBus() {
        return true;
    }

    @Override
    protected void getBundleExtras(Bundle bundle) {

    }

    //finish的返回监听
    //这里的requestCode参数，就是上面设置的 1 ，当跳转的页面返回的时候，通过这个加以判断
    //resultCode ,这个参数是在跳转的页面里面规定的，它也是一个int类型的标志
    //第三个参数包含了返回的值
    //如果不需要所跳转的页面返回值，也就不需要这个方法了
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (requestCode == 200 && resultCode == 200)
        {
            clearData();
        }
    }


    /**
     * EventBus接收信息的方法，开启后才会调用(非粘性事件)
     *
     * @param event
     */
    @Override
    protected void EventBean(BaseEventBusBean event) {
//        XLog.e("----------接收返回--------------");
//        XLog.e("接收返回："+event.getEventCode());
        if (event != null && event.getEventCode() == EventCode.displacement_refresh) {

        }
    }

    @Override
    public boolean isPlayMusic() {
        return true;
    }

    @Override
    protected void initView() {
        unbinder = ButterKnife.bind(this);
        setTitleName("确认货品");

        initAdapter();
        initData();
        initEdit();
        //监听浮动按钮
        iv_drag.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if (!iv_drag.isDrag()) {
                    ActivityScanerCode.setScanerListener(mScanerListener);
                    ActivityScanerCode.intent2Activity(mContext, BaseConfig.COMMON_SCANNER_ONLY);
                }
            }
        });



    }


    private void initData() {
        density = ToolUtils.getDensity(this);
    }


    private void initAdapter(){

        int columnCount = 2; // 默认列数
// 根据屏幕宽度动态调整列数
        DisplayMetrics displayMetrics = new DisplayMetrics();
        getWindowManager().getDefaultDisplay().getMetrics(displayMetrics);
        int screenWidth = displayMetrics.widthPixels;
// 这里可以根据屏幕宽度动态计算列数，例如每列200dp
        float dpWidth = screenWidth / (displayMetrics.densityDpi / 160f);
        columnCount = (int) (dpWidth / 200); // 假设每列期望宽度为200dp

        emptyView = this.getLayoutInflater().inflate(R.layout.pager_empty, (ViewGroup) recyclerView.getParent(), false);
        errorView = this.getLayoutInflater().inflate(R.layout.pager_error, (ViewGroup) recyclerView.getParent(), false);

        mAdapter  = new FinishWorkAdapter(boxSkuBeanList);
        mAdapter.setEmptyView(emptyView);
        mAdapter.openLoadAnimation(BaseQuickAdapter.SCALEIN);

        recyclerView.setLayoutManager(new FullyGridLayoutManager(mContext, columnCount, GridLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(mAdapter);

         mAdapter.setOnItemChildClickListener(new BaseQuickAdapter.OnItemChildClickListener() {
            @Override
            public void onItemChildClick(BaseQuickAdapter adapter, View view, int position) {
                currentSku = position;
                confirmGoods();
            }
        });
    }

    public static class FinishWorkAdapter extends BaseQuickAdapter<BoxSkuBean, BaseViewHolder> {

        public FinishWorkAdapter(List<BoxSkuBean> data){
            super(R.layout.item_sku_img, data);
        }



        @Override
        protected void convert(BaseViewHolder helper, BoxSkuBean item) {
            //定义setOnItemChildClickListener 事件点击
            helper.addOnClickListener(R.id.ll_show_img);
            TextView textView = helper.getView(R.id.tv_name);
            textView.setText(item.getSku());


            ImageView imageView = helper.getView(R.id.iv_show);

            RequestOptions options = new RequestOptions()
                    .centerCrop()
                    .placeholder(R.color.color_f6)
                    .diskCacheStrategy(DiskCacheStrategy.ALL);

            Glide.with(helper.itemView.getContext())
                    .load(item.getUrl())
                    .apply(options)
                    .into(imageView);

        }
    }

    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        //XLog.e("event:"+event.getKeyCode());
//        if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER )  && event.getAction() == KeyEvent.ACTION_DOWN){
//            //按确定键
//            if(validate()){
//                doPutIn();
//            }
//            return true;
//        }
        return super.dispatchKeyEvent(event);
    }

    //监听按键
    public boolean onKeyDown(int keyCode, KeyEvent event) {
        //XLog.e("监听按键："+keyCode);XLog.e(event);
        if (scanBean.getIsBroadcast() == 0 && StoTongJNI.getIns(mContext).getEventFuction(keyCode) == StoPdaKeyEvent.KEYCODE_SCAN
                && event.getRepeatCount() == 0) {

            if (StoTongJNI.getIns(mContext).GetScannerIsScanning()) {
//
            } else {
                StoTongJNI.getIns(mContext).SetScannerStart();
            }
        }
        return super.onKeyDown(keyCode, event);
    }

    @SuppressLint("HandlerLeak")
    Handler scanHandler = new Handler() {

        @Override
        public void handleMessage(Message msg) {
            // TODO Auto-generated method stub
            if (msg.obj != null) {

                String scanResult = msg.obj.toString().trim();
                if (!scanResult.isEmpty()) {
                    setScanResult(scanResult);
                }
            }

        }

    };

    @Override
    public void onScanResults(String str) {
        Message msg = new Message();
        msg.obj = str;
        scanHandler.sendMessage(msg);


    }


    @Override
    public void onScanResults(String str, int type) {

    }

    /**
     * 定义广播接受
     */
    BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String scanResult = intent.getStringExtra(scanBean.getDataName());
            if (scanResult == null) {
                return;
            }
            String scanStatus = "";
            if (!scanBean.getStatusName().isEmpty()) {
                scanStatus = intent.getStringExtra(scanBean.getStatusName());
            } else {
                scanStatus = scanResult.isEmpty() ? "" : "ok"; //有值 默认是扫码成功;
            }

            //新大陆(MT65,MT90) 需要手动关闭
            if (!scanBean.getActionStop().isEmpty()) {
                Intent stopIntent = new Intent(scanBean.getActionStop());
                mContext.sendBroadcast(stopIntent);
            }

            if ("ok".equals(scanStatus)) {
                setScanResult(scanResult);
            } else {
                showErrorToast(getString(R.string.scan_failed));
            }
        }
    };

    /**
     * 注册广播
     */
    private void initReceiver() {

        try {

            String scanStr = getScanSetting();
            scanBean = JsonUtil.getObject(scanStr, ScanBean.class);
            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播

            if (is_broadcast == 1) {
                IntentFilter mFilter = new IntentFilter(scanBean.getAction());
                this.registerReceiver(mReceiver, mFilter);
            } else {
                //不广播进行处理 jni模式
                String pdaBrand = StoTongJNI.getmPdaBrand();
                if (!pdaBrand.isEmpty()) {
                    StoTongJNI.getIns(this).setmScanCB(this);
                    StoTongJNI.getIns(this).SetScannerOn();
                }
            }


        } catch (Exception e) {
            showErrorToast("获取扫码配置失败" + e.getMessage());
            XLog.e("获取扫码配置失败:" + e.getMessage());
        }
    }


    //统一按钮回调
    public void callbackEditor(View v) {
        switch (v.getId()) {
            case R.id.et_box_code:
                checkBox();
                break;
            case R.id.et_unit_code:

              
                break;
            
            default:
        }
    }

    private void initEdit() {



        List<EditText> list = new ArrayList<>();
        list.add(etUnitCode);
        list.add(etBoxCode);
        unifyEdit(list);
        etBoxCode.requestFocus();
    }

    private OnRxScanerListener mScanerListener = new OnRxScanerListener() {
        @Override
        public void onSuccess(String type, Result result) {
            String scanResult = result.getText();
            switch (type) {
                case BaseConfig.COMMON_SCANNER_ONLY:
                    setScanResult(scanResult);

                    break;
            }
        }

        @Override
        public void onFail(String type, String message) {

        }
    };

    //把扫描结果赋值
    private void setScanResult(String scanResult) {
        //获取焦点的view对象
        View view = getWindow().getDecorView().findFocus();
        //如果是EditText
        if (view instanceof EditText) {
            ((EditText) view).setText(scanResult);
            //执行回调
            callbackEditor(view);
        }
    }


    /**
     * 检查打托信息
     */
    private void confirmGoods() {

        if (!validate()) {
            return;
        }


        String postJson = formatParam(2);

        if (!checkRepeat(Urls.FXY_DETECTION_CONFIRM_GOODS + (postJson))) {
            return;
        }

        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_CONFIRM_GOODS).upJson(postJson)
                .execute(new MyDialogCallback(this, true, true) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        super.onSuccess(response);
                        try {
                            ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
                            if (bean.code == 1) {
                                //showSuccessToast(bean.msg);
                                Bundle bundle = new Bundle();
                                bundle.putString("data",bean.data);
                                intentPageResult(mActivity, DetectionWorkMainActivity.class, bundle,200);
                            } else {
                                etBoxCode.selectAll();
                                showWarningToast(bean.msg);
                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                            XLog.e("请求返回打托信息错误", e.getMessage());
                        }
                    }
                });
    }

    /**
     * 检查库位
     */
    private void checkBox() {
        if (!checkNull(etBoxCode)) {
            setEditTextFocused(etBoxCode, true);
            showWarningToast(etBoxCode.getHint().toString());
            return ;
        }

        String postJson = formatParam(1);
        if (!checkRepeat(Urls.FXY_DETECTION_BOX_NUMBER + (postJson))) {
            return;
        }

        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_BOX_NUMBER).upJson(postJson)
                .execute(new MyDialogCallback(this, true, true) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        super.onSuccess(response);
                        ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);

                        try {
                            if (bean.code == 1) {
                                showSuccessToast(bean.msg);
                                etUnitCode.requestFocus();
                                BoxInfoBean boxInfoBean = JsonUtil.jsonString2Bean(bean.data, BoxInfoBean.class);

                                List<BoxSkuBean> tmpBoxSkuBean = boxInfoBean.getSkuList();
                                if (boxInfoBean.getPage()==1){
                                    boxSkuBeanList = tmpBoxSkuBean;
                                    mAdapter.setNewData(boxSkuBeanList);
                                }else{
                                    boxSkuBeanList.containsAll(tmpBoxSkuBean);
                                    mAdapter.addData(boxSkuBeanList);
                                }
                                mAdapter.notifyDataSetChanged();
                                llHostDiff.setVisibility(View.VISIBLE);
                            } else {
                                showWarningToast(bean.msg);
                            }
                        } catch (Error e) {
                            e.printStackTrace();
                            XLog.e("请求返回箱号检查错误", e.getMessage());
                        }
                    }
                });
    }

    //检查
    private void checkHostDiff(HashMap<String, Object> postData){

        if (!validate()) {
            return;
        }

        postData.put("box_number", etBoxCode.getText().toString().trim());
        postData.put("unit_code", etUnitCode.getText().toString().trim());
        String postJson = (new Gson()).toJson(postData);

        if (!checkRepeat(Urls.FXY_DETECTION_DEAL_DIFF + (postJson))) {
            return;
        }

        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_DEAL_DIFF).upJson(postJson)
                .execute(new MyDialogCallback(this, true, true) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        super.onSuccess(response);
                        try {
                            ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
                            JSONObject dataObject = new JSONObject(bean.data);
                            if (bean.code == 1) {
                                showSuccessToast(bean.msg);

                                if(dataObject.has("next_step")){

                                    ConfirmGoodsBean  confirmGoodsBean = JsonUtil.jsonString2Bean(bean.data, ConfirmGoodsBean.class);
                                    confirmGoodsBean.setIsConfirm("1");
                                    confirmGoodsBean.setUnitCode(etUnitCode.getText().toString().trim());
                                    Bundle bundle = new Bundle();
                                    bundle.putString("data",(new Gson()).toJson(confirmGoodsBean));
                                    bundle.putString("node_code",dataObject.getString("next_step"));
                                    intentPageResult(mActivity, DetectionWorkMainActivity.class, bundle,200);
                                }else{
                                    clearData();
                                }


                            } else {

                                if (dataObject.has("need_confirm") && dataObject.getString("need_confirm").equals("1")){
                                    listBtn = JsonUtil.jsonString2Beans(dataObject.getString("btns"), BtnInfoBean.class);

                                    confirmDialog = new ConfirmDialog(mContext,listBtn);
                                    confirmDialog.setOnCallbackListener(new ConfirmDialog.OnCallbackListener() {
                                        @Override
                                        public void OnCallback(String value,int position) {
                                            HashMap<String, Object> postData = new HashMap<>();
                                            postData.put(listBtn.get(position).getKey(),listBtn.get(position).getValue());
                                            checkHostDiff(postData);
                                        }
                                    });
                                    confirmDialog.showDialog(bean.msg);
                                    if (confirmDialog!=null){
                                        confirmDialog.dismiss();
                                    }
                                }else{
                                    showWarningToast(bean.msg);
                                }

                            }


                        } catch (Exception e) {
                            e.printStackTrace();
                            XLog.e("请求返回打托信息错误", e.getMessage());
                        }
                    }
                });

    }


    /**
     * @param type int 1、库位，2、箱号
     * @return
     */
    private String formatParam(int type) {
        JSONObject jsonObject = new JSONObject();
        try {
            jsonObject.put("box_number", etBoxCode.getText().toString().trim());
            if (type > 1) {
                jsonObject.put("unit_code", etUnitCode.getText().toString().trim());

                jsonObject.put("goods_id", boxSkuBeanList.get(currentSku).getGoodsId());
            }

        } catch (Exception e) {
            e.printStackTrace();
            XLog.e("组装数据失败");
        }
        return jsonObject.toString();
    }

    /*
     * 校验必录
     */
    private boolean validate() {

        if (!checkNull(etUnitCode)) {
            setEditTextFocused(etUnitCode, true);
            showWarningToast(etUnitCode.getHint().toString());
            return false;
        }

        if (!checkNull(etBoxCode)) {
            setEditTextFocused(etBoxCode, true);
            showWarningToast(etBoxCode.getHint().toString());
            return false;
        }

        return true;
    }




    //清除订单信息
    private void clearData() {
        etBoxCode.setText("");
        etUnitCode.setText("");

        setEditTextNormal(etUnitCode, true);
        setEditTextNormal(etBoxCode, true);
        llHostDiff.setVisibility(View.GONE);
        etUnitCode.requestFocus();
    }

    @OnClick({R.id.btn_host_diff})
    public void onViewClicked(View view) {
        Bundle bundle = new Bundle();
        switch (view.getId()) {
            case R.id.btn_host_diff:
                HashMap<String, Object> postData = new HashMap<>();
                checkHostDiff(postData);
                break;
            default:
                break;
        }
    }

    /**
     * 统一设置Edit监听
     *
     * @param list
     */
    public void unifyEdit(List<EditText> list) {
        for (int i = 0; i < list.size(); i++) {
            EditText editText = list.get(i);

            LinearLayout linearLayout = (LinearLayout) editText.getParent();
            ImageButton imageButton = getChildImageButton(linearLayout);


            //监听按确定
            editText.setOnEditorActionListener(new TextView.OnEditorActionListener() {
                @Override
                public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                    XLog.e("actionId：" + actionId);
                    if (event != null) {
                        XLog.e("KeyCode:" + event.getKeyCode() + "--ActionCode:" + event.getAction());
                    }

                    //|| (actionId == KeyEvent.ACTION_DOWN && event.getKeyCode()==KeyEvent.KEYCODE_ENTER )
                    if (actionId == EditorInfo.IME_ACTION_SEND || actionId == EditorInfo.IME_ACTION_DONE ||
                            (actionId == KeyEvent.ACTION_DOWN && event.getKeyCode() == KeyEvent.KEYCODE_ENTER)) {
                        if (v.getText().toString().trim().isEmpty()) {
                            setEditTextFocused(v, true);
                            showWarningToast(v.getHint().toString());
                            return true;
                        } else {
                            setEditTextNormal(v, true);
                        }
                        callbackEditor(v);
                        return false;
                    }
                    return false;

                    //返回true，保留软键盘。false，隐藏软键盘
                }
            });
            editText.addTextChangedListener(new TextWatcher() {
                public void onTextChanged(CharSequence s, int start, int before, int count) {
                    EditText currentEditText = null;
                    ImageButton currentImage = null;
                    //获取焦点的view对象
                    View view = getWindow().getDecorView().findFocus();
                    //如果是EditText
                    if (view instanceof EditText) {
                        currentEditText = (EditText) view;
                        currentImage = getChildImageButton((LinearLayout) currentEditText.getParent());
                    }

                    if (s.length() > 0) {

                        if (currentImage != null) {
                            currentImage.setVisibility(View.VISIBLE);
                        }
                        if (currentEditText != null) {
                            setEditTextNormal(currentEditText, true);
                        }

                    } else {
                        if (currentImage != null) {
                            currentImage.setVisibility(View.INVISIBLE);
                        }
                        if (currentEditText != null) {
                            setEditTextFocused(currentEditText, true);
                        }
                    }
                }

                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

                public void afterTextChanged(Editable s) {

                }
            });

            if (imageButton != null) {
                unifyClearEdit(imageButton);
            }
        }
    }


    @Override
    protected void onDestroy() {
        unbinder.unbind();


        super.onDestroy();
    }

    @Override
    protected void onResume() {
        super.onResume();
        initReceiver();
    }

    @Override
    protected void onPause() {
        super.onPause();
        //销毁在onResume()方法中的广播
        try {
            //停止扫描
            Integer is_broadcast = scanBean.getIsBroadcast();//是否广播
            if (is_broadcast == 0) {
                StoTongJNI.getIns(mContext).SetScannerStop();
                StoTongJNI.getIns(mContext).SetScannerOff();
            } else {
                unregisterReceiver(mReceiver);
            }
        } catch (Exception e) {
            XLog.e("销毁广播失败：", e.getMessage());
        }
    }


}
