package com.fxy.putOut;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Build;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
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.RadioButton;
import android.widget.TextView;
import android.widget.Toast;

import androidx.annotation.RequiresApi;

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.baselibrary.util.StringUtils;
import com.fxy.baselibrary.views.MarqueeTextView;
import com.fxy.bean.ActionBean;
import com.fxy.bean.ScanBean;
import com.fxy.common.CommonDialog;
import com.fxy.common.PictureSelectorUpload;
import com.fxy.constant.BaseConfig;
import com.fxy.constant.EventCode;
import com.fxy.constant.SPCache;
import com.fxy.net.MyDialogCallback;
import com.fxy.net.Urls;
import com.fxy.view.FloatingImageView;
import com.google.zxing.Result;
import com.luck.picture.lib.config.PictureConfig;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
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 QualityVolumeMainActivity extends  BaseActivity implements StoJNI.ScanCallBack {
    /**
     * 列表适配器
     */
    Context mContext = this;

    //单号清除
    @BindView(R.id.ib_container_code_clear)
    ImageButton ibContainerCodeClear;

    //单号
    @BindView(R.id.et_container_code)
    EditText etContainerCode;


    //单号清除
    @BindView(R.id.ib_unique_code_clear)
    ImageButton ibUniqueCodeClear;

    //单号
    @BindView(R.id.et_unique_code)
    EditText etUniqueCode;

    //唯一标识区域
    @BindView(R.id.ll_unique_code)
    LinearLayout llUniqueCode;

    //重量区域
    @BindView(R.id.ll_weight)
    LinearLayout llWeight;

    //测量区域
    @BindView(R.id.ly_measure_content)
    LinearLayout llMeasureContent;





    @BindView(R.id.et_weight)
    EditText etWeight;

    @BindView(R.id.et_length)
    EditText etLength;

    @BindView(R.id.et_width)
    EditText etWidth;

    @BindView(R.id.et_height)
    EditText etHeight;



    @BindView(R.id.mt_container_type)
    MarqueeTextView mtContainerType;

    //托盘组件
    @BindView(R.id.ll_container)
    LinearLayout llContainer;


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



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


    private Unbinder unbinder;


    private int qualityOrderId = 0;

    //托盘对象
    private JSONObject inboundObject = null;

    //是否显示
    private boolean isUniqueCode = false;

    //是否材积显示
    private boolean isVolume = false;



    //是否允许编辑
    private boolean isAllowEdit = true;


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

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

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

    @Override
    protected void getBundleExtras(Bundle bundle) {
        String containerType = bundle.getString("container_type","");
        qualityOrderId = bundle.getInt("quality_order_id",0);
    }
    //finish的返回监听
    //这里的requestCode参数，就是上面设置的 1 ，当跳转的页面返回的时候，通过这个加以判断
    //resultCode ,这个参数是在跳转的页面里面规定的，它也是一个int类型的标志
    //第三个参数包含了返回的值
    //如果不需要所跳转的页面返回值，也就不需要这个方法了
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
//        XLog.e("requestCode："+requestCode);
//        XLog.e("resultCode："+resultCode);
//        XLog.e(data);
        if (requestCode == 200 && resultCode == 200)//之前提到的两个标志，在这里显示出了作用
        {
        }else if (resultCode==0){
        }
    }


    /**
     * 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("完成质检");

        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(){
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("quality_order_id",qualityOrderId);
            if (!checkRepeat(Urls.FXY_GET_QUALITY_ORDER+(jsonObject.toString()))){
                Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
                return;
            }

            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_GET_QUALITY_ORDER).upJson(jsonObject)
                    .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);

                                inboundObject = new JSONObject();
                                if (bean.data!=null && !bean.data.isEmpty() && !bean.data.equals("[]")){
                                    inboundObject = new JSONObject(bean.data);
                                }


                                if(bean.code == 1){

                                    mtContainerType.setText(inboundObject.getString("quality_result"));


                                    isAllowEdit = inboundObject.getInt("fill_data")==0;
                                    if (!isAllowEdit){
                                        etLength.setText(inboundObject.getString("inbound_length"));
                                        etWidth.setText(inboundObject.getString("inbound_width"));
                                        etHeight.setText(inboundObject.getString("inbound_length"));
                                        etWeight.setText(inboundObject.getString("inbound_weight"));
                                    }

                                    etLength.setEnabled(isAllowEdit);
                                    etWidth.setEnabled(isAllowEdit);
                                    etHeight.setEnabled(isAllowEdit);
                                    etWeight.setEnabled(isAllowEdit);

                                    isUniqueCode = inboundObject.getInt("hide_unique")==0;
                                    llUniqueCode.setVisibility(isUniqueCode ? View.VISIBLE : View.GONE);

                                    isVolume = inboundObject.getInt("hide_weightsize")==0;
                                    llWeight.setVisibility(isVolume ? View.VISIBLE : View.GONE);
                                    llMeasureContent.setVisibility(isVolume ? View.VISIBLE : View.GONE);


                                    etContainerCode.setEnabled(true);
                                    etContainerCode.requestFocus();

                                }else{
                                    inboundObject = null;
                                    showWarningToast(bean.msg);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                showEmptyView("体积信息解析错误:"+e.getMessage());
                                XLog.e("获取体积信息解析错误",e.getMessage());
                            }
                        }
                    });
        }catch (Exception e){
            inboundObject = new JSONObject();
            XLog.e("获取体积错误:"+e.getMessage(),e);
        }
    }





    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        //XLog.e("Action："+event.getAction()+"---event:"+event.getKeyCode());
        if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER )  && event.getAction() == KeyEvent.ACTION_DOWN){
            if(validate()){
                doConfirm();
            }
            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_container_code:

                if (isUniqueCode){
                    checkQualityPallet();
                }else{
                    if (isVolume && isAllowEdit){
                        etWeight.requestFocus();
                    }else{
                        doConfirm();
                    }
                }
                break;
            case R.id.ib_unique_code_clear:
                doConfirm();
            default:
        }
    }





    private void initEdit() {
        List<EditText> list = new ArrayList<>();
        list.add(etContainerCode);
        list.add(etUniqueCode);
        unifyEdit(list);
    }

    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 checkQualityPallet(){
        try {
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("quality_order_id",qualityOrderId);
            jsonObject.put("pallet_code",etContainerCode.getText().toString().trim());
            if (!checkRepeat(Urls.FXY_CHECK_QUALITY_PALLET+(jsonObject.toString()))){
                Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show();
                return;
            }

            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_CHECK_QUALITY_PALLET).upJson(jsonObject)
                    .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);

                                inboundObject = new JSONObject();
                                if (bean.data!=null && !bean.data.isEmpty() && !bean.data.equals("[]")){
                                    inboundObject = new JSONObject(bean.data);
                                }
                                if(bean.code == 1){
                                    if (isVolume &&  isAllowEdit){
                                        etWeight.requestFocus();
                                    }else{
                                        etUniqueCode.requestFocus();
                                    }


                                }else{
                                    etContainerCode.selectAll();
                                    showWarningToast(bean.msg);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                showEmptyView("检查托盘解析错误:"+e.getMessage());
                                XLog.e("检查托盘解析错误",e.getMessage());
                            }
                        }
                    });
        }catch (Exception e){
            XLog.e("检查托盘错误:"+e.getMessage(),e);
        }
    }


    public void doConfirm() {
        //校验数据
        if (!validate()){
            return;
        }

        try {
            String pallet_code = etContainerCode.getText().toString().trim();
            JSONObject param = new JSONObject();
            param.put("quality_order_id",qualityOrderId);
            param.put("pallet_code",pallet_code);
            param.put("inbound_weight",etWeight.getText().toString().trim());
            param.put("inbound_length",etLength.getText().toString().trim());
            param.put("inbound_width",etWidth.getText().toString().trim());
            param.put("inbound_height",etHeight.getText().toString().trim());
            if (isUniqueCode){
                param.put("unique_code",etUniqueCode.getText().toString().trim());
            }

            if (!checkRepeat(Urls.FXY_FINISH_QUALITY+(param.toString()))){return;}

            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_FINISH_QUALITY)
                    .upJson(param)
                    .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 result = new JSONObject();
                                if (bean.data!=null && !bean.data.isEmpty() && !bean.data.equals("[]")){
                                    result = new JSONObject(bean.data);
                                }

                                if(bean.code == 1){
                                    showSuccessToast(bean.msg);
                                    Intent intent = new Intent();
                                    setResult(200, intent);//返回值，200 是改返回的标志，也会返回
                                    finish();
                                }else{
                                    showWarningToast(bean.msg);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                XLog.e("请求入库返回错误",e.getMessage());
                            }
                        }
                    });
        } catch (JSONException e) {
            showEmptyView("请求入库失败:"+e.getMessage());
            e.printStackTrace();
        }


    }

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

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

        //是否检查材积
        boolean isCheckVolume = isVolume && isAllowEdit;

        if (isCheckVolume && !isNumber(getValStr(etWeight),3)){
            setEditTextFocused(etWeight,false);
            showWarningToast(etWeight.getHint().toString());
            return false;
        }

        if (isCheckVolume && !isNumber(getValStr(etLength),2)){
            setEditTextFocused(etLength,false);
            showWarningToast(etLength.getHint().toString());
            return false;
        }

        if (isCheckVolume && !isNumber(getValStr(etWidth),2)){
            setEditTextFocused(etWidth,false);
            showWarningToast(etWidth.getHint().toString());
            return false;
        }

        if (isCheckVolume && !isNumber(getValStr(etHeight),2)){
            setEditTextFocused(etHeight,false);
            showWarningToast(etHeight.getHint().toString());
            return false;
        }

        return true;
    }



    @OnClick({R.id.btn_confirm})
    public void onViewClicked(View view) {
        Bundle bundle = new Bundle();
        switch (view.getId()) {
            case R.id.btn_confirm:
                doConfirm();
                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 (actionId == EditorInfo.IME_ACTION_SEND || actionId == EditorInfo.IME_ACTION_DONE   ) {
                        if (v.getText().toString().trim().isEmpty()) {
                            setEditTextFocused(v,true);
                            showWarningToast(v.getHint().toString());
                            return false;
                        }else{
                            setEditTextNormal(v,true);
                        }

                        callbackEditor(v);

                        return false;
                    }
                    return 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());
        }
    }


}
