package com.fxy.putIn;

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.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.KeyEvent;
import android.view.View;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.Switch;
import android.widget.TextView;
import android.widget.Toast;

import com.chad.library.adapter.base.BaseQuickAdapter;
import com.elvishew.xlog.XLog;
import com.fxy.R;
import com.fxy.adapter.GoodsAdapter;
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.baselibrary.views.dialog.RxDialogZoomImageView;
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.logic.ViewLogic;
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.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 CheckGoodsDetailsMainActivity extends  BaseActivity implements StoJNI.ScanCallBack {

    /**
     * 列表适配器
     */
    Context mContext = this;

    //
    @BindView(R.id.ll_check_goods_list)
    LinearLayout llCheckGoodsList;

    @BindView(R.id.ll_check_qty)
    LinearLayout llCheckQty;

    @BindView(R.id.et_check_qty)
    EditText etCheckQty;

    @BindView(R.id.ll_check_options)
    LinearLayout llCheckOptions;


    @BindView(R.id.s_is_qty_fail)
    Switch sIsQtyFail;
    @BindView(R.id.s_is_second_hand)
    Switch sIsSecondHand;

    @BindView(R.id.ll_take_picture)
    LinearLayout llTakePicture;

    @BindView(R.id.ll_remark_info)
    LinearLayout llRemarkInfo;

    @BindView(R.id.btn_confirm)
    TextView btnConfirm;

    @BindView(R.id.rv_show_img)
    RecyclerView rvShowImg;


    @BindView(R.id.et_remark)
    EditText etRemark;

    private GoodsAdapter goodsAdapter;
    //搬运工队列
    private JSONArray issueList= new JSONArray();

    private Integer selectId= 0;

    private ArrayList photoList =new ArrayList<>();

    private PictureSelectorUpload pictureSelectorUpload;

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

    //订单信息对象
    private JSONObject inboundObject = new JSONObject();

    private JSONObject  goodsObject =  new JSONObject();
    private int  idxId = 0;

    private List<JSONObject>  goodsList = new ArrayList<>();

    protected String action;

    private boolean isOk = true;

    private Unbinder unbinder;

    private JSONObject postParam = new JSONObject();

    private ViewLogic viewLogic;

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

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

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

    @Override
    protected void getBundleExtras(Bundle bundle) {
        try {
            goodsObject = new JSONObject(bundle.getString("goods_object"));
        } catch (JSONException e) {
            XLog.e("接收数据解析："+e.getMessage());
            e.printStackTrace();
        }
    }

    public void setBaseInfo(JSONObject jsonObject){

        try {

            ((MarqueeTextView)llCheckGoodsList.findViewById(R.id.mt_order_number)).setText(jsonObject.getString("order_number"));
            ((MarqueeTextView)llCheckGoodsList.findViewById(R.id.mt_cn_name)).setText(jsonObject.getString("cn_name"));
            ((MarqueeTextView)llCheckGoodsList.findViewById(R.id.mt_model_number)).setText(jsonObject.getString("specification"));
            ((MarqueeTextView)llCheckGoodsList.findViewById(R.id.mt_qty)).setText(jsonObject.getString("qty"));
            final String image_url = jsonObject.getString("image_url");

            ImageView ivGoodsImg =  (ImageView)findViewById(R.id.iv_goods_img);
            new ViewLogic.GlideImageLoder(mContext,ivGoodsImg,image_url);
            ivGoodsImg.setOnClickListener(new View.OnClickListener(){
                @Override
                public void onClick(View v) {
                    RxDialogZoomImageView rxDialogZoomImageView = new RxDialogZoomImageView(mContext);
                    rxDialogZoomImageView.setImagePath(image_url);
                    rxDialogZoomImageView.show();
                }
            });

        } catch (Exception e) {
            XLog.e("查验列表数据渲染失败："+e.getMessage());
            e.printStackTrace();
        }

    }

    //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) {// 图片选择结果回调
                pictureSelectorUpload.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("货物查验");

        initEdit();
        iniData();
        pictureSelectorUpload = new PictureSelectorUpload(CheckGoodsDetailsMainActivity.this,rvShowImg,"check");
    }



    @Override
    public boolean dispatchKeyEvent(KeyEvent event) {
        //XLog.e("event:"+event.getKeyCode());
        if ((event.getKeyCode()==KeyEvent.KEYCODE_DPAD_CENTER || event.getKeyCode()==KeyEvent.KEYCODE_ENTER )  && event.getAction() == KeyEvent.ACTION_DOWN){
            //按确定键
            if(this.validate()){
                finishCheck();
            }
        }
        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());
        }
    }

    private void initEdit() {

    }


    private void iniData(){

        setBaseInfo(goodsObject);
    }



    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);

            switch (view.getId()) {

                default:
            }


        }
    }


    private void finishCheck(){
        if (!validate()){
            return;
        }
        //数据检查不通过

        if (!isOk){  Toast.makeText(this, getString(R.string.error_data_processed), Toast.LENGTH_LONG).show(); return;}
        isOk = false;
        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_FINISH_CHECK).upJson(postParam)
                .execute(new MyDialogCallback(this, true, true) {
                    @Override
                    public void onSuccess(Response<String> response) {
                        isOk = true;
                        super.onSuccess(response);
                        try {
                            ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
                            if(bean.code == 1){
                                showSuccessToast(bean.msg);
                                JSONObject data = new JSONObject(bean.data);
                                if (data.has("next_package") && !data.getString("next_package").isEmpty() &&
                                        !data.getString("next_package").equals("[]")){
                                    goodsObject = new JSONObject(data.getString("next_package"));
                                    iniData();
                                    restoreData();
                                }else{
                                    Intent intent = new Intent();
                                    intent.putExtra("opt_status", "success");
                                    setResult(200, intent);//返回值，200 是改返回的标志，也会返回
                                    finish();
                                }

                            }else{
                                showWarningToast(bean.msg);
                            }
                        } catch (Exception e) {
                            e.printStackTrace();
                            XLog.e("添加理货数据结果返回错误",e.getMessage());
                        }
                    }
                });
    }

    private void restoreData(){

        postParam.remove("photo");
        postParam.remove("remark");
        postParam.remove("check_qty");
        postParam.remove("idx_id");
        etRemark.setText("");
        etCheckQty.setText("");
        pictureSelectorUpload.emptyRemake();



        sIsQtyFail.setChecked(false);
        sIsSecondHand.setChecked(false);

        llCheckQty.setVisibility(View.GONE);
        llRemarkInfo.setVisibility(View.GONE);
        btnConfirm.setBackgroundResource(R.drawable.bg_green_item);
        btnConfirm.setText("查验无异常，下一个");
    }

    /*
     * 校验必录
     */
    private boolean validate(){
        photoList = pictureSelectorUpload.getPhotoList();
        try {
            postParam.put("idx_id",goodsObject.getString("idx_id"));
            //检查是否拍照
            if (photoList.size()==0){
                showWarningToast("请拍照上传");
                return false;
            }
            Gson gson = new Gson();
            postParam.put("photo",gson.toJson(photoList));


            if (postParam.has("is_qty_fail") && postParam.getString("is_qty_fail").equals("Y")){



                if (etCheckQty.getText().toString().isEmpty()){
                    showWarningToast((String) etCheckQty.getHint());
                    return false;
                }

                postParam.put("check_qty",etCheckQty.getText().toString());

            }

            if (!postParam.has("is_qty_fail")){
                postParam.put("is_qty_fail","N");
            }


            if (!postParam.has("is_second_hand")){
                postParam.put("is_second_hand","N");
            }


            if (postParam.getString("is_qty_fail").equals("N") || postParam.getString("is_second_hand").equals("N")){
                postParam.put("remark",etRemark.getText().toString());
            }




        } catch (JSONException e) {
            showWarningToast("系统异常"+e.getMessage());
            e.printStackTrace();
            return false;
        }



        return true;
    }


    //清除订单信息
    private boolean checkAllSwitch() {
        boolean result = false;
        if (putSwitch(sIsQtyFail,"is_qty_fail")){result = true;}
        if (putSwitch(sIsSecondHand,"is_second_hand")){result = true;}
        return result;
    }

    private boolean putSwitch(Switch sv,String name){
        boolean isChecked = sv.isChecked();
        try {
            postParam.put(name,isChecked?"Y":"N");



        } catch (JSONException e) {
            XLog.e("设置Switch异常");
            e.printStackTrace();
        }
        return isChecked;
    }

    //sIsGoodinfoMatch,sIsBattery,sIsMagnetic,sIsWood,sIsExtra,sIsOther
    @OnClick({R.id.s_is_qty_fail,R.id.s_is_second_hand,R.id.btn_confirm})
    public void onViewClicked(View view) {
        Bundle bundle = new Bundle();
        switch (view.getId()) {
            case R.id.s_is_qty_fail:
            case R.id.s_is_second_hand:
                boolean allSwitch =  checkAllSwitch();
                int visibility = View.GONE;
                if (putSwitch(sIsQtyFail,"is_qty_fail")){
                    visibility = View.VISIBLE;
                }
                llCheckQty.setVisibility(visibility);


                if (allSwitch){
                    llRemarkInfo.setVisibility(View.VISIBLE);
                    btnConfirm.setBackgroundResource(R.drawable.bg_orange_item);
                    btnConfirm.setText("完成查验，下一个");
                }else {
                    llRemarkInfo.setVisibility(View.GONE);
                    btnConfirm.setBackgroundResource(R.drawable.bg_green_item);
                    btnConfirm.setText("查验无异常，下一个");
                }
                break;
            case R.id.btn_confirm:
                finishCheck();
            default:
                break;
        }
    }

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

        pictureSelectorUpload.removeHandler();
        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());
        }
    }

}
