package com.fxy.hk;

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.text.Editable;
import android.text.TextWatcher;
import android.view.KeyEvent;
import android.view.View;
import android.view.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageButton;
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.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.bean.UploadResultBean;
import com.fxy.common.FiledUpload;
import com.fxy.constant.BaseConfig;
import com.fxy.constant.EventCode;
import com.fxy.helper.HkDataHelper;
import com.fxy.net.MyDialogCallback;
import com.fxy.net.Urls;
import com.fxy.realm.CutRuleRealm;
import com.fxy.realm.HkTransDetailRealm;
import com.fxy.realm.HkTransRealm;
import com.fxy.view.FloatingImageView;
import com.google.gson.Gson;
import com.google.zxing.Result;
import com.jaredrummler.materialspinner.MaterialSpinner;
import com.luck.picture.lib.PictureSelector;
import com.luck.picture.lib.config.PictureConfig;
import com.luck.picture.lib.config.PictureMimeType;
import com.luck.picture.lib.entity.LocalMedia;
import com.lzy.okgo.OkGo;
import com.lzy.okgo.model.Response;

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 io.realm.RealmResults;
import sto.android.app.StoJNI;
import sto.android.app.StoPdaKeyEvent;
import sto.android.app.StoTongJNI;

public class HkPutinMainActivity extends  BaseActivity implements StoJNI.ScanCallBack{

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

    //单号清除
    @BindView(R.id.ib_order_no_clear)
    ImageButton ibOrderNoClear;

    //单号
    @BindView(R.id.et_order_no)
    EditText etOrderNo;


    @BindView(R.id.ms_batch_list)
    MaterialSpinner batchListSpinner;

    @BindView(R.id.mt_order_code)
    MarqueeTextView mtOrderCode;


    @BindView(R.id.tv_sort)
    TextView tvSort;

    private String batchNumber = "";




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

    private List<CutRuleRealm> cutRuleRealmList;

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


    private List<String> spinnerBatchList = new ArrayList<String>();



    protected String action;


    private Unbinder unbinder;


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

    @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 (resultCode == RESULT_OK && requestCode == PictureConfig.CHOOSE_REQUEST) {
            List<LocalMedia>  images = PictureSelector.obtainMultipleResult(data);
            LocalMedia localMedia = images.get(0);
            String localPath = localMedia.isCompressed() ? localMedia.getCompressPath():localMedia.getPath();
            filedUpload.filedUpload(localPath);
            filedUpload.setOnChangeListener(new FiledUpload.UploadChangeListener() {
                @Override
                public void uploadResult(UploadResultBean uploadResultBean) {
                    if (uploadResultBean.getStatus()==1){
                        ArrayList<String> photoList =  new ArrayList<String>();
                        photoList.add(uploadResultBean.getPath());
                        pictureInbound(photoList);
                    }else{
                        showErrorToast("上传图片失败");
                        XLog.e("上传结果失败"+uploadResultBean.getError());
                    }
                }
            });
        }
    }

    /**
     * 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("托盘入库");

        //拉取数据
        (new HkDataHelper(HkPutinMainActivity.this)).getBaseInfo();

        initEdit();
        iniData();

        initSpinner();

        filedUpload = new FiledUpload(HkPutinMainActivity.this,"photo");


        //监听浮动按钮
        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 iniData(){

        RealmResults<HkTransRealm> realmResultsAll  = mRealm.where(HkTransRealm.class).findAll();
        realmResultsAll.load();
        spinnerBatchList = new ArrayList<String>();
        if (realmResultsAll.size()>0){
            for (int i=0;i<realmResultsAll.size();i++){
                spinnerBatchList.add(realmResultsAll.get(i).getBatch());
            }
        }

        if (spinnerBatchList.size()>0){
            batchNumber = spinnerBatchList.get(0);
        }
        batchListSpinner.setItems(spinnerBatchList);

        batchListSpinner.setSelected(false);

        cutRuleRealmList =  mRealm.where(CutRuleRealm.class).findAll();


        initSpinner();
    }


    /**
     *  初始化下拉框控件值
     */
    private void initSpinner() {


        batchListSpinner.setOnItemSelectedListener(new MaterialSpinner.OnItemSelectedListener<String>() {
            @Override public void onItemSelected(MaterialSpinner view, int position, long id, String item) {
                batchNumber = item;
                etOrderNo.setEnabled(true);

            }
        });
    }



    //拍照上传
    private void pictureInbound(ArrayList<String> photoList){
        try {
            JSONObject jsonObject = new JSONObject();

            Gson gson = new Gson();
            jsonObject.put("photo",gson.toJson(photoList));
            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_GK_INBOUND_PICTURE).upJson(jsonObject)
                    .execute(new MyDialogCallback(this, true, false) {
                        @Override
                        public void onSuccess(Response<String> response) {
                            super.onSuccess(response);
                            try {
                                ActionBean bean = JsonUtil.getObject(response.body(), ActionBean.class);
                                if(bean.code == 1){
                                    showSuccessToast("上传成功");
                                }else{
                                    showErrorToast("上传失败");
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                XLog.e("香港图片结果返回错误",e.getMessage());
                            }
                        }
                    });
        } catch (Exception e) {
            e.printStackTrace();

        }
    }

    @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){
            //按确定键
        }
        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() {
        //
        etOrderNo.setOnEditorActionListener(new TextView.OnEditorActionListener() {
            @Override
            public boolean onEditorAction(TextView v, int actionId, KeyEvent event) {
                if (actionId == EditorInfo.IME_ACTION_DONE) {
                    String orderNo = etOrderNo.getText().toString().trim();
                    if (StringUtils.isEmpty(orderNo)) {
                        setEditTextFocused(v,true);
                        showWarningToast(v.getHint().toString());
                        return false;
                    }
                    inboundPutin();
                    return false;
                }
                return false;
            }
        });
        etOrderNo.addTextChangedListener(new TextWatcher() {
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                if (s.length() > 0 ) {
                    if (etOrderNo.isEnabled()){
                        ibOrderNoClear.setVisibility(View.VISIBLE);
                    }
                    setEditTextNormal(etOrderNo,true);
                } else {
                    ibOrderNoClear.setVisibility(View.INVISIBLE);
                    setEditTextFocused(etOrderNo,true);
                }
            }

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

            public void afterTextChanged(Editable s) {

            }
        });
        ibOrderNoClear.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                etOrderNo.requestFocus();
                etOrderNo.getText().clear();
            }
        });
    }




    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()) {
                case R.id.et_order_no:
                    inboundPutin();
                    break;
                default:
            }


        }
    }

    public String strByCutRule(String str,List<CutRuleRealm> cutRuleRealmList){

        str = str.replaceAll("\u001D", "");
        str = str.trim();
        if (cutRuleRealmList.size()==0){
            return  str;
        }
        int len = str.length();


        for (int i=0;i<cutRuleRealmList.size();i++){
            CutRuleRealm cutRuleRealm = cutRuleRealmList.get(i);
            if (len!=cutRuleRealm.getNumberLength()){
                continue;
            }
            String number_start = cutRuleRealm.getNumberStart();
            int cut_type = cutRuleRealm.getCutType();
            int number_length = cutRuleRealm.getNumberLength();
            int start_index = cutRuleRealm.getStartIndex()-1;
            int cut_length = cutRuleRealm.getCutLength();

            if (len!=number_length){
                continue;
            }

            if (!number_start.equals("%") && !str.startsWith(number_start)){
                continue;
            }

            if (cut_type==1){
                str = str.substring(start_index,cut_length+start_index);
            }
            //从后往前截取待完善
        }

        return  str;

    }


    /**
     * 查询订单
     * @param trackingNumber
     * @return
     */
    private HkTransDetailRealm getDetailRealm(String trackingNumber){



        HkTransDetailRealm detailRealm = mRealm.where(HkTransDetailRealm.class)
                .equalTo("tracking_number",trackingNumber)
                .equalTo("batch_number",batchNumber)
                .findFirst();
        if (detailRealm==null){
            trackingNumber = strByCutRule(trackingNumber,cutRuleRealmList);
            detailRealm = mRealm.where(HkTransDetailRealm.class)
                    .equalTo("tracking_number",trackingNumber)
                    .equalTo("batch_number",batchNumber)
                    .findFirst();
        }
        return detailRealm;

    }

    private void inboundPutin(){
        if (!validate()){
            return;
        }

        String trackingNumber = etOrderNo.getText().toString().trim();

        HkTransDetailRealm  detailRealm = getDetailRealm(trackingNumber);
        if (detailRealm==null){
            authCamera();
            mtOrderCode.setText("");
            tvSort.setText("");
            etOrderNo.setText("");
            return;
        }
        showSuccessToast("Success","hk"+detailRealm.getSort());
        mtOrderCode.setText(detailRealm.getTrackingNumber());
        tvSort.setText(detailRealm.getSort());
        etOrderNo.setText("");

        try {
            JSONObject postParam = new JSONObject();
            postParam.put("transport_order_number",batchNumber);
            postParam.put("tracking_number",detailRealm.getTrackingNumber());
            postParam.put("realm_id",detailRealm.getId());


            OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_GK_INBOUND_PUTIN).upJson(postParam)
                    .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){

                                    JSONObject data = new JSONObject(bean.data);
                                    if (data.has("realm_id")){
                                        setIsFinish(data.getString("realm_id"),1);
                                    }
                                }else{
//                                    showWarningToast(bean.msg);
                                }
                            } catch (Exception e) {
                                e.printStackTrace();
                                XLog.e("添加理货数据结果返回错误",e.getMessage());
                            }
                        }
                    });


        } catch (JSONException e) {
            e.printStackTrace();

        }


    }


    private void setIsFinish(String realmId,int isFinish){
        //更新值
        mRealm.beginTransaction();
        HkTransDetailRealm myObject = mRealm.where(HkTransDetailRealm.class).equalTo("id",realmId).findFirst();
        myObject.setPushStatus(isFinish);
        mRealm.commitTransaction();
    }

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

        if (batchNumber.isEmpty()){
            showErrorToast(batchListSpinner.getHint().toString());
            setEditTextFocused(batchListSpinner,true);
            return false;
        }
        setEditTextNormal(batchListSpinner,true);

        //数据检查不通过
        String orderNo = etOrderNo.getText().toString().trim();
        if (orderNo.isEmpty()){
            showWarningToast(etOrderNo.getHint().toString());
            return false;
        }

        return true;
    }


    private void authCamera(){
        //拍照
        com.luck.picture.lib.PictureSelector.create(this)
                .openCamera(PictureMimeType.ofImage())
                //只需要拍照
                //.selectionMode(PictureConfig.SINGLE)
//                .isCamera(true)
                //.compressMaxKB()//压缩最大值kb compressGrade()为Luban.CUSTOM_GEAR有效
                .compress(true) // 压缩
                .cropCompressQuality(100)// 裁剪压缩质量 默认100
                .minimumCompressSize(100) //最新压缩图片 默认100
                .forResult(PictureConfig.CHOOSE_REQUEST);
    }

    //
    @OnClick({R.id.btn_photos})
    public void onViewClicked(View view) {
        Bundle bundle = new Bundle();
        switch (view.getId()) {
            case R.id.btn_photos:
                authCamera();
                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());
        }
    }

}
