package com.fxy.detection;

import android.annotation.SuppressLint;
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.RecyclerView;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.LinearLayout;
import android.widget.TextView;

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.util.JsonUtil;
import com.fxy.baselibrary.views.MarqueeTextView;
import com.fxy.bean.ActionBean;
import com.fxy.bean.ScanBean;
import com.fxy.common.PictureSelectorUpload;
import com.fxy.constant.BaseConfig;
import com.fxy.constant.EventCode;
import com.fxy.detection.bean.DealDiffBean;
import com.fxy.detection.bean.NeedPhotoBean;
import com.fxy.net.MyDialogCallback;
import com.fxy.net.Urls;
import com.google.gson.Gson;
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.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 DetectionDealDiffMainActivity extends BaseActivity implements StoJNI.ScanCallBack {
    /**
     * 列表适配器
     */
    Context mContext = this;


    @BindView(R.id.mt_box_number)
    MarqueeTextView mtBoxNumber;

    @BindView(R.id.mt_unit_code)
    MarqueeTextView mtUnitCode;

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

    @BindView(R.id.ll_recycler_view)
    LinearLayout llRecyclerView;


    private DealDiffBean dealDiffBean = new DealDiffBean();
    private List<NeedPhotoBean> listNeedPhoto  = new ArrayList<>();

    //节点
    private String nodeCode = "";

    //定义文件上传
    private HashMap<Integer,PictureSelectorUpload> mapPictureSelector = new HashMap<>();
    private int currentPictureInx = -1;

    //提交数据
    private JSONObject submitData = new JSONObject();

    private Unbinder unbinder;

    private ScanBean scanBean;

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

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

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

    @Override
    protected void getBundleExtras(Bundle bundle) {

        dealDiffBean = JsonUtil.jsonString2Bean(bundle.getString("data"),DealDiffBean.class);

    }

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

        // 图片选择结果回调
        if (resultCode == RESULT_OK) {
            // 图片选择结果回调
            if (requestCode == PictureConfig.CHOOSE_REQUEST || requestCode == PictureConfig.REQUEST_CAMERA) {
                PictureSelectorUpload filedUpload = mapPictureSelector.get(currentPictureInx);
                if (filedUpload != null){
                    filedUpload.getSelectImg(data);
                }
            }
        }

    }


    /**
     * 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();
    }



    private void initData() {
        nodeCode = dealDiffBean.getNodeCode();

        mtBoxNumber.setText(dealDiffBean.getBoxNumber());
        mtUnitCode.setText(dealDiffBean.getUnitCode());
        listNeedPhoto = dealDiffBean.getNeedPhotos();


        if (listNeedPhoto!=null){
            for (int i=0;i<listNeedPhoto.size();i++){
                addPictureSelectorUpload(i,listNeedPhoto.get(i).getLimit());
            }
        }

    }

    /**
     *
     * @param position int 遍历添加
     */
    private void addPictureSelectorUpload(int position,int limit){
        String tagKey = "recyclerview"+position;
        View itemPictureSelector = View.inflate(mContext, R.layout.item_picture_selector, null);
        TextView tvPicturesTitle =   itemPictureSelector.findViewById(R.id.tv_pictures_title);
        tvPicturesTitle.setText(listNeedPhoto.get(position).getFieldKey());
        RecyclerView rvLabelShowImg = (RecyclerView)itemPictureSelector.findViewById(R.id.recyclerview);
        itemPictureSelector.setTag(tagKey);
        llRecyclerView.addView(itemPictureSelector);
        PictureSelectorUpload tmpPictureSelector  = setItemPicture(String.valueOf(position),rvLabelShowImg,limit,PictureConfig.TYPE_IMAGE);
        mapPictureSelector.put(position,tmpPictureSelector);
    }

    /**
     * 设置多个上传文件
     * @param actionType String
     * @param showImg RecyclerView
     */
    private PictureSelectorUpload setItemPicture(String actionType,RecyclerView showImg,int maxNum,int pictureType){
        PictureSelectorUpload pictureUpload = new PictureSelectorUpload(DetectionDealDiffMainActivity.this,showImg,"detection",maxNum,pictureType);
        pictureUpload.setActionType(actionType);
        pictureUpload.setCompress(true,100,500);
        pictureUpload.setOnlyCamera(true);
        pictureUpload.setProgressType(2);
        //showImg.onTouchEvent()

        pictureUpload.setOnChangeListener(new PictureSelectorUpload.UploadChangeListener() {
            @Override
            public void uploadResult(boolean State,String actionType) {
                if (State) {

                }
            }

            @Override
            public void uploadActionType(String actionType) {
                System.out.println("actionType："+actionType);
                currentPictureInx = Integer.parseInt(actionType);
            }
        });
        return  pictureUpload;
    }

    @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()) {
            default:
        }
    }

    private void initEdit() {

    }

    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 doConfirm() {
        if (!validate()) {
            return;
        }

        String postJson = submitData.toString();
        if (!checkRepeat(Urls.FXY_DETECTION_COMPLETED + (postJson))) {
            return;
        }
        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_COMPLETED).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);
                                finish();
                            } else {
                                showWarningToast(bean.msg);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            XLog.e("请求返回信息错误", e.getMessage());
                        }
                    }
                });
    }


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

        try {
            submitData.put("box_number",dealDiffBean.getBoxNumber());
            submitData.put("goods_id","");
            submitData.put("unit_code",dealDiffBean.getUnitCode());

            JSONArray steps = new JSONArray();
            if (listNeedPhoto!=null && listNeedPhoto.size()>0){
                for (int i=0;i<listNeedPhoto.size();i++){
                    JSONObject item = new JSONObject();
                    ArrayList<String> urlList = mapPictureSelector.get(i).getPhotoList();
                    String fieldKey = listNeedPhoto.get(i).getFieldKey();
                    if (urlList.size()==0){
                        showErrorToast(fieldKey+"需要拍照");
                        return  false;
                    }
                    item.put("node_code",nodeCode);
                    item.put("attr_id","");
                    item.put("field_key",fieldKey);
                    item.put("url",(new Gson()).toJson(urlList));
                    steps.put(i,item);
                }
            }
        } catch (JSONException e) {
            e.printStackTrace();
            showErrorToast(e.getMessage());
            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;
        }
    }


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


}
