package com.fxy.detection;

import android.annotation.SuppressLint;
import android.app.AlertDialog;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
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.inputmethod.EditorInfo;
import android.widget.EditText;
import android.widget.ImageButton;
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.AsyncPictureSelector;
import com.fxy.common.AsyncPictureUpload;
import com.fxy.constant.BaseConfig;
import com.fxy.constant.EventCode;
import com.fxy.constant.SPCache;
import com.fxy.detection.bean.TakePictureBean;
import com.fxy.detection.bean.TrackingBoxBean;
import com.fxy.detection.bean.TrayMakeBean;
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.JSONObject;

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

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 TrayMakeSecondMainActivity extends  BaseActivity implements StoJNI.ScanCallBack{

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

    @BindView(R.id.ll_label_picture)
    LinearLayout llLabelPicture;
    //拍照区域
    @BindView(R.id.ll_camera_picture_module)
    LinearLayout llCameraPictureModule;

    @BindView(R.id.mt_tracking_number)
    MarqueeTextView mtTrackingNumber;

    @BindView(R.id.mt_operate_number)
    MarqueeTextView mtOperateNumber;



    @BindView(R.id.ll_await_num)
    LinearLayout llAwaitNum;

    @BindView(R.id.tv_await_num)
    TextView tvAwaitNum;


    private HashMap<String, Object> postData  = new HashMap<>();

    private HashMap<String, AsyncPictureSelector> mapPictureSelector = new HashMap<>();

    private List<TakePictureBean> takePictureBeanList = new ArrayList<>();
    private AsyncPictureUpload asyncPictureUpload = new AsyncPictureUpload(this);

    private TrayMakeBean trayMakeBean;

    private String currentPictureType= "stack_img";

    private boolean currentUploadStatus = false;

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


    private boolean showWeightImg = false;

    private boolean isRequiredShow = false;

    private  ArrayList<String> baseImgList = new ArrayList<>();
    protected String action;


    private Unbinder unbinder;

    private JSONObject postParam = new JSONObject();

    private int leisure = 10;


    private Handler workHandler;
    private Runnable idleRunnable;

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

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

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

    @Override
    protected void getBundleExtras(Bundle bundle) {
        //XLog.e("接收数据解析：",bundle);
        trayMakeBean = JsonUtil.jsonString2Bean(bundle.getString("data"), TrayMakeBean.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) {
                if (mapPictureSelector.containsKey(currentPictureType)){
                    mapPictureSelector.get(currentPictureType).setNotifyParam(getNotifyParam());
                    mapPictureSelector.get(currentPictureType).getSelectImg(data);
                }
                totalAwaitNum();
                setNewTiming();
                for (int i=0;i<takePictureBeanList.size();i++){
                    int num = takePictureBeanList.get(i).getNumber();
                    String field = takePictureBeanList.get(i).getField();
                    int has = mapPictureSelector.get(field).getOssPhotoList().size();
                    if (has < num ){
                        mapPictureSelector.get(field).authCamera();
                        return;
                    }
                }

                if (mapPictureSelector.get("stack_img").getOssPhotoList().size()>0){
                    //页面跳转
                    submitLabelImg();
                }else{
                    llLabelPicture.setVisibility(View.VISIBLE);
                }

            }
        }

        if (requestCode == 200 && resultCode == 200)//之前提到的两个标志，在这里显示出了作用
        {
            if (data.hasExtra("data") && !data.getStringExtra("data").isEmpty()){
                trayMakeBean = JsonUtil.jsonString2Bean(data.getStringExtra("data"), TrayMakeBean.class);
                setRequestResult();
            }


            initFinish();
        }


    }

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

        assert event != null;
        switch (event.getEventCode()){
            case EventCode.picture_selector_lister:
                String pictureType = event.getData().toString();
                if (mapPictureSelector.containsKey(pictureType)){
                    currentPictureType = pictureType;
                }
                break;
            case EventCode.file_upload_lister:
                totalAwaitNum();
                break;
        }


    }

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


    @Override
    protected void initView() {
        unbinder = ButterKnife.bind(this);
        setTitleName("托盘清点");

        setRequestResult();
        setCameraPicture();
        initEdit();
        iniData();
        RecyclerView rvLabelShowImg = (RecyclerView)llLabelPicture.findViewById(R.id.rv_show_img);
        mapPictureSelector.put("stack_img",setItemPicture("stack_img",rvLabelShowImg,9));


        totalAwaitNum();

        workHandler = new Handler(Looper.getMainLooper());
        // 定义空闲任务
        idleRunnable = new Runnable() {
            @Override
            public void run() {
                // 执行空闲后的操作
                operateStartUpload();
            }
        };

        SPCache spCache = SPCache.getInstance(this);
        leisure = spCache.getLeisure();

        // 初始化时设置计时器
        workHandler.postDelayed(idleRunnable, leisure * 60 * 1000);
    }


    private void setNewTiming(){
        try {
            // 取消之前的计时器
            workHandler.removeCallbacks(idleRunnable);
            // 重新计时
            workHandler.postDelayed(idleRunnable, leisure * 60 * 1000); // 2 分钟
        } catch (Exception e) {
            e.printStackTrace();

        }

    }


    //设置返回
    private void setRequestResult(){
        takePictureBeanList = trayMakeBean.getNeedPhoto();
        llCameraPictureModule.setVisibility(View.VISIBLE);

        mtOperateNumber.setText(String.valueOf(trayMakeBean.getHasDoDui()));
        mtTrackingNumber.setText(trayMakeBean.getTrackingNumber());
     }

    private void setCameraPicture(){
        llCameraPictureModule.removeAllViews();;
        for (int i=0;i<takePictureBeanList.size();i++){
            TakePictureBean takePictureBean = takePictureBeanList.get(i);
            addPictureSelectorUpload(llCameraPictureModule,takePictureBean);
        }
    }

    public void addPictureSelectorUpload(LinearLayout linearLayout, TakePictureBean takePictureBean){
        View itemPictureSelector = View.inflate(mContext, R.layout.item_picture_selector, null);
        TextView tvPicturesTitle = itemPictureSelector.findViewById(R.id.tv_pictures_title);
        tvPicturesTitle.setText(takePictureBean.getTitle());
        RecyclerView rvLabelShowImg = (RecyclerView)itemPictureSelector.findViewById(R.id.recyclerview);
        linearLayout.addView(itemPictureSelector);
        AsyncPictureSelector tmpPictureSelector  = setItemPicture(takePictureBean.getField(),rvLabelShowImg,takePictureBean.getNumber());
        mapPictureSelector.put(takePictureBean.getField(),tmpPictureSelector);
    }

    /**
     * 设置多个上传文件
     * @param uploadType String
     * @param showImg RecyclerView
     */
    private AsyncPictureSelector setItemPicture(String uploadType,RecyclerView showImg,int num){

        String notifyUrl = Urls.getServiceAddress(this) + Urls.FXY_DETECTION_PUTIN;
        AsyncPictureSelector pictureUpload = new AsyncPictureSelector(TrayMakeSecondMainActivity.this,showImg,"detection",uploadType,notifyUrl,false);
        pictureUpload.setUploadType(uploadType);
        pictureUpload.setCompress(true,100,100);
        pictureUpload.setOnlyCamera(true);
        pictureUpload.setMaxSelectNum(num);

        return  pictureUpload;
    }


    @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 HashMap<String, Object> getNotifyParam(){
        postData.put("is_check",1);
        postData.put("tracking_number",trayMakeBean.getTrackingNumber().trim());
        return postData;
    }



    //监听按键
    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(){
        baseImgList.add("stack_img");
    }

    //getAwaitNum
    private void totalAwaitNum(){
        int awaitNum = asyncPictureUpload.getAwaitNum();
        tvAwaitNum.setText(String.valueOf(awaitNum));
        if (awaitNum == 0){
            operateStopUpload();
        }
    }

    //统一按钮回调
    @SuppressLint("NonConstantResourceId")
    public void callbackEditor(View v){
        setNewTiming();
        switch (v.getId()) {

            default:
        }

    }

    /**
     * 统一设置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 && isRequiredShow){
                            setEditTextFocused(currentEditText,true);
                        }
                    }
                }

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

                public void afterTextChanged(Editable s) {

                }
            });

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


    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);
            showSuccessToast("扫描成功");
            callbackEditor(view);
        }
    }


    //检查是否存在上传
    private void checkIsUpload(){

    }



    //提交面单信息
    private void submitLabelImg(){
        checkIsUpload();


        Gson gson = new Gson();
        Map<String,Object> math = new HashMap<>();
        math.put("tracking_number",trayMakeBean.getTrackingNumber().trim());

        //面单
        List<String> stringList = mapPictureSelector.get("stack_img").getOssPhotoList();
        if (stringList.size()==0){
            showWarningToast("面单照片不能为空");
            return;
        }
        math.put("stack_img_tag",mapPictureSelector.get("stack_img").getUniqueTag());
        math.put("stack_img",gson.toJson(stringList));
        math.put("is_check",1);
        //拍照
        if (takePictureBeanList.size()>0){

            Map<String,Object> otherImg = new HashMap<>();
            for (int i=0; i < takePictureBeanList.size();i++){
                String name = takePictureBeanList.get(i).getField();
                if (!mapPictureSelector.containsKey(name) ){
                    showErrorToast("页面渲染异常，请更新操作");
                }

                List<String> tmpList = mapPictureSelector.get(name).getOssPhotoList();
                if (tmpList.size() == 0){
                    showWarningToast("请上传".concat(takePictureBeanList.get(i).getTitle()).concat("拍照"));
                }
                otherImg.put(name,gson.toJson(tmpList));
            }
            math.put("other_img",gson.toJson(otherImg));
        }



        OkGo.<String>post(Urls.getServiceAddress(this) + Urls.FXY_DETECTION_PALLET_STACK_IMG).upJson(gson.toJson(math))
                .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.data!=null && !bean.data.isEmpty() && !bean.data.equals("[]")){
                                trayMakeBean =  JsonUtil.jsonString2Bean(bean.data,TrayMakeBean.class);
                            }

                            String voiceName = trayMakeBean.getVoiceName();
                            if(bean.code == 1){
                                showSuccessToast(bean.msg,voiceName);
                                Bundle bundle = new Bundle();
                                bundle.putString("data",bean.data);
                                intentPageResult(TrayMakeSecondMainActivity.this, TrayMakeThirdMainActivity.class, bundle,200);

                            }else{
                                showWarningToast(bean.msg,voiceName);
                            }

                        }catch (Exception e) {
                            e.printStackTrace();
                            XLog.e("第二步确认错误",e.getMessage());
                        }
                    }
                });

    }

    private void initFinish(){

        for (int i=0;i<baseImgList.size();i++){
            if (mapPictureSelector.containsKey(baseImgList.get(i))){
                mapPictureSelector.get(baseImgList.get(i)).emptyRemake();
            }
        }
        for (int n=0;n<takePictureBeanList.size();n++){
            String tmpKey = takePictureBeanList.get(n).getField();
            if (mapPictureSelector.containsKey(tmpKey) ){
                mapPictureSelector.get(tmpKey).emptyRemake();
            }
        }
    }



    //sIsGoodinfoMatch,sIsBattery,sIsMagnetic,sIsWood,sIsExtra,sIsOther
    @OnClick({R.id.btn_confirm})
    public void onViewClicked(View view) {
        Bundle bundle = new Bundle();
        switch (view.getId()) {
            case R.id.btn_confirm:
                Intent intent = new Intent();
                setResult(200, intent);//返回值，2 是改返回的标志，也会返回
                showSuccessToast("success");
                finish();
                break;
            default:
                break;
        }
    }

    private void operateStopUpload(){
        if (currentUploadStatus){
            asyncPictureUpload.setStopUpload();
        }
    }
    private void operateStartUpload(){
        if (!currentUploadStatus){
            asyncPictureUpload.setStartUpload();
        }
    }




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

        asyncPictureUpload.removeHandler();
        // 确保清除所有的回调以防止内存泄漏
        workHandler.removeCallbacks(idleRunnable);
        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());
        }
    }

}
