package com.densowave.barcodetorfid_hitachi.view;

import android.Manifest;
import android.app.AlertDialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.content.pm.ActivityInfo;
import android.content.pm.PackageManager;
import android.os.Bundle;
import android.os.Handler;
import android.text.Editable;
import android.text.InputType;
import android.text.TextWatcher;
import android.util.Log;
import android.view.View;
import android.view.inputmethod.InputMethodManager;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.Toast;

import androidx.appcompat.app.AppCompatActivity;
import androidx.core.app.ActivityCompat;
import androidx.core.content.ContextCompat;


import com.densowave.barcodetorfid_hitachi.R;
import com.densowave.barcodetorfid_hitachi.util.CommonUtil;
import com.densowave.barcodetorfid_hitachi.util.DataList;
import com.densowave.barcodetorfid_hitachi.util.Globals;
import com.densowave.barcodetorfid_hitachi.util.MasterList;
import com.densowave.barcodetorfid_hitachi.util.ProductList;
import com.densowave.barcodetorfid_hitachi.util.RegisterList;
import com.densowave.scannersdk.Barcode.BarcodeData;
import com.densowave.scannersdk.Barcode.BarcodeDataReceivedEvent;
import com.densowave.scannersdk.Barcode.BarcodeException;
import com.densowave.scannersdk.Barcode.BarcodeScanner;
import com.densowave.scannersdk.Common.CommManager;
import com.densowave.scannersdk.Common.CommScanner;
import com.densowave.scannersdk.Dto.BarcodeScannerSettings;
import com.densowave.scannersdk.Listener.BarcodeDataDelegate;
import com.densowave.scannersdk.Listener.ScannerAcceptStatusListener;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.TreeMap;

/*
 *登録画面
 *
 */
public class QRReadActivity extends AppCompatActivity implements ScannerAcceptStatusListener, BarcodeDataDelegate {
    private Button bt_back,bt_ok,bt_check;
    private ImageButton ib_edit_qr,ib_edit_rfid;
    private EditText et_barcode,et_tagid,et_product;
    private LinearLayout ll_panel;
    private TextView tv_store_title,tv_store_name;
    private FrameLayout fl_layout;
    private TreeMap<String, String> readMap = new TreeMap<>();
    private HashMap<String, String> doubleMap = new HashMap<>();
    private CommScanner mScanner = null;
    public BarcodeScanner mBarcodeScanner;
    public static BarcodeScannerSettings mBarcodeScannerSettings;
    private List<CommScanner> scanner_list1;
    private List<String> list;
    private int index = 0;
    private boolean bBarcodeOpen;
    private final String TAG = "ScannerSample";
    private String start_time,store_no,area_no;
    private int barcount = 1;
    private AlertDialog mDialog;
    private CommonUtil common = new CommonUtil();
    private List<MasterList> masterList = new ArrayList<MasterList>();
    private List<ProductList> productList = new ArrayList<ProductList>();
    private List<RegisterList> registerList = new ArrayList<RegisterList>();
    private Globals global;
    private List<DataList> dataList = new ArrayList<DataList>();
    private TreeMap<String,String> barproductMap = new TreeMap<>();
    private boolean qr_edit_flg,rfid_edit_flg;
    /*
     *初回起動ロジック
     *
     */
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_qrread);
        setRequestedOrientation(ActivityInfo.SCREEN_ORIENTATION_NOSENSOR);
        //Intent intent = getIntent();
        //store_no = intent.getStringExtra("STORE_NO");
        //area_no = intent.getStringExtra("AREA_NAME");
        //マスタ取得
        //masterList = common.getMasterRead(this,store_no,area_no);
        //productList = common.getProductRead(this);
        //マスタの存在チェック
        //if(masterList == null || masterList.size()<=0){
        //    new AlertDialog.Builder(QRReadActivity.this)
        //            .setMessage(getString(R.string.qr_dialog_dismiss))
        //            .setCancelable(false)
        //            .setPositiveButton(getString(R.string.yes),  new DialogInterface.OnClickListener() {
        //                @Override
        //                public void onClick(DialogInterface dialog, int which) {
        //                    finish();
        //                }
        //            })
        //            .setNegativeButton(getString(R.string.no),null)
        //            .show();
        //}
        //else{
            tv_store_title = findViewById(R.id.tv_store_title);
            tv_store_name = findViewById(R.id.tv_store_name);
            //tv_store_title.setText(tv_store_title.getText());
            //tv_store_name.setText("(" + masterList.get(0).getStoreName() + ")");
        //}
        // グローバル変数を扱うクラスを取得する
        //global = (Globals) getApplication();
        // グローバル変数を扱うクラスを初期化する
        //global.init();
        // グローバル変数に値をセット
        //global.mMaster = masterList;
        //global.mProduct = productList;
        //for (MasterList row: masterList) {
        //    barproductMap.put(row.getManagementPlateNo(),row.getProductName());
        //}
        if (ContextCompat.checkSelfPermission(
                this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
            // 許可されている時の処理
        }else{
            ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE}, 0);
        }
        fl_layout = findViewById(R.id.fl_layout);
        //設定ボタンの設定
        et_product = findViewById(R.id.et_product);
        et_barcode = findViewById(R.id.et_barcode);
        et_barcode.setInputType(InputType.TYPE_NULL);
        et_barcode.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // EditTextのフォーカスが外れた場合
                if (hasFocus == false) {
                    // ソフトキーボードを非表示にする
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        });
        et_tagid = findViewById(R.id.et_tagid);
        et_tagid.setInputType(InputType.TYPE_NULL);
        et_tagid.setOnFocusChangeListener(new View.OnFocusChangeListener() {

            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                // EditTextのフォーカスが外れた場合
                if (hasFocus == false) {
                    // ソフトキーボードを非表示にする
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(v.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        });
        ib_edit_qr = findViewById(R.id.ib_edit_qr);
        ib_edit_qr.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!qr_edit_flg){
                    qr_edit_flg = true;
                    ib_edit_qr.setImageResource(R.drawable.edit);
                    et_barcode.setInputType(InputType.TYPE_CLASS_NUMBER);
                }
                else{
                    qr_edit_flg = false;
                    ib_edit_qr.setImageResource(R.drawable.noedit);
                    et_barcode.setInputType(InputType.TYPE_NULL);
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(et_barcode.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        });
        ib_edit_rfid = findViewById(R.id.ib_edit_rfid);
        ib_edit_rfid.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!rfid_edit_flg){
                    rfid_edit_flg = true;
                    ib_edit_rfid.setImageResource(R.drawable.edit);
                    et_tagid.setInputType(InputType.TYPE_CLASS_TEXT);
                }
                else{
                    rfid_edit_flg = false;
                    ib_edit_rfid.setImageResource(R.drawable.noedit);
                    et_tagid.setInputType(InputType.TYPE_NULL);
                    InputMethodManager imm = (InputMethodManager)getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(et_tagid.getWindowToken(), InputMethodManager.HIDE_NOT_ALWAYS);
                }
            }
        });
        bt_ok = findViewById(R.id.bt_ok);
        bt_ok.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                addData();
            }
        });
        //終了ボタンの設定
        bt_back = findViewById(R.id.bt_back);
        bt_back.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                new AlertDialog.Builder(QRReadActivity.this)
                        .setMessage(getString(R.string.dialog_exit))
                        .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                createCSV();
                            }
                        })
                        .setNegativeButton(getString(R.string.no), null)
                        .show();
            }
        });
        bt_check = findViewById(R.id.bt_check);
        bt_check.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(doubleMap.size()>0){
                    showCheckDialog();
                }
            }
        });

        et_barcode.setFocusable(true);
        et_barcode.requestFocus();
        ll_panel = findViewById(R.id.ll_panel);
        try {
            //ペアリストを取得
            scanner_list1 = CommManager.getScanners();
            list = new ArrayList<>();
            for (int i = 0; i < scanner_list1.size(); ++i) {
                Log.d("ExecuteRFIDActivity", "BT Address=" + scanner_list1.get(i).getBTAddress());
                Log.d("ExecuteRFIDActivity", "BT LC=" + scanner_list1.get(i).getBTLocalName());
                // Bluetoothローカル名を選択
                if (scanner_list1.get(i).getBTLocalName().startsWith("SP1-")) {
                    list.add(scanner_list1.get(i).getBTLocalName());
                }
            }
            //候補の中から接続対象を選択する
            if (list.size()>0){
                final String[] items = list.toArray(new String[list.size()]);
                new AlertDialog.Builder(QRReadActivity.this)
                        .setTitle(getString(R.string.inventory_connect))
                        .setCancelable(false)
                        .setItems(items, new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                // item_which pressed
                                index = which;
                                startSP1();
                            }
                        })
                        .show();
            }
            else{
                new AlertDialog.Builder(QRReadActivity.this)
                        .setMessage(getString(R.string.inventory_not_sp1))
                        .setCancelable(false)
                        .setPositiveButton(getString(R.string.yes),  new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                finish();
                            }
                        })
                        .show();
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /*
     *SP1接続開始処理
     *ペアリング済みのSP1一覧から接続対象を選択した際に呼び出される
     *接続結果を受信するaddAcceptStatusListenerを設定
     *
     */
    public void startSP1(){
        for (CommScanner row: scanner_list1 ) {
            if(row.getBTLocalName().equals(list.get(index))){
                mScanner = row;
            }
        }
        //デバイスが取得できた場合、接続する
        // Start accept
        CommManager.addAcceptStatusListener(this);
        CommManager.startAccept();
    }
    public void createCSV(){
        if(dataList.size()>0){
            // OK button pressed
            //CSV作成処理
            if (ContextCompat.checkSelfPermission(
                    QRReadActivity.this, Manifest.permission.WRITE_EXTERNAL_STORAGE)== PackageManager.PERMISSION_GRANTED){
                // 許可されている時の処理
                common.CsvCreate(QRReadActivity.this,dataList,store_no,1,true);
            }else{
                if (ActivityCompat.shouldShowRequestPermissionRationale(QRReadActivity.this,
                        Manifest.permission.WRITE_EXTERNAL_STORAGE)) {
                    ActivityCompat.requestPermissions(QRReadActivity.this,
                            new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE},0);
                } else {
                    Toast.makeText(QRReadActivity.this, getString(R.string.permission_error), Toast.LENGTH_LONG).show();
                    finish();
                }
            }
        }
        if (mScanner != null) {
            try {
                mScanner.close();
            }
            catch (Exception e){
                e.printStackTrace();
            }
        }
        finish();
    }
    /*
     *バーコード初回立ち上げ処理
     *
     */
    @Override
    public void OnScannerAppeared(CommScanner commScanner) {
        Log.d("ExecuteConnectActivity", " OnScannerAppeared ");
        Log.d("ExecuteConnectActivity", "BT Address=" + commScanner.getBTAddress()) ;
        try {
            CommManager.endAccept();
            CommManager.removeAcceptStatusListener(this);

            mScanner = commScanner;
            mScanner.claim();
            openbarcode();
        }catch (Exception e){
            e.printStackTrace();
        }
    }

    /**
     * バーコードスキャン設定
     *
     */
    private void openbarcode() {
        if (bBarcodeOpen == false) {
            try {
                if(mScanner != null){
                    mBarcodeScanner = mScanner.getBarcodeScanner();
                    mBarcodeScanner.setDataDelegate(this);
                    // get scanner settings
                    mBarcodeScannerSettings = mBarcodeScanner.getSettings();
                    mBarcodeScanner.setSettings(common.setSettingsBarcodeScanner(mBarcodeScannerSettings));
                }
                if(mBarcodeScanner != null){
                    // open
                    mBarcodeScanner.openReader();
                    bBarcodeOpen = true;
                }
            } catch (BarcodeException e) {
                e.printStackTrace();
                Log.d("LightTag", "Error3");
            }
        }
    }
    /*
     *バーコードデータ受信処理
     *
     */
    @Override
    public void onBarcodeDataReceived(CommScanner commScanner, BarcodeDataReceivedEvent barcodeDataReceivedEvent) {
        List<BarcodeData> barcodeDataList = barcodeDataReceivedEvent.getBarcodeData();
        try{
            for (BarcodeData data : barcodeDataList) {
                runOnUiThread(new Runnable() {
                            // Apply data to UI
                            String denso = "";
                            String data = "";

                            Runnable setData(String _denso, String _data) {
                                denso = _denso;
                                data = _data;
                                return this;
                            }

                            @Override
                            public void run() {
                                try {
                                    View current = QRReadActivity.this.getCurrentFocus();
                                    switch (current.getId()) {
                                        case R.id.et_tagid:
                                            et_tagid.setText(data);
                                            bt_ok.setFocusable(true);
                                            bt_ok.requestFocus();
                                            break;
                                        case R.id.et_barcode:
                                            et_barcode.setText(data);
                                            et_tagid.setFocusable(true);
                                            et_tagid.requestFocus();
                                            break;
                                        default:
                                            et_tagid.setFocusable(true);
                                            et_tagid.setFocusableInTouchMode(true);
                                            et_tagid.requestFocus();
                                            break;
                                    }
                                } catch (Exception e) {
                                }
                            }
                        }.setData(data.getSymbologyDenso(), new String(data.getData(), "Shift-JIS"))
                );
            }
        }catch (Exception e){
            e.printStackTrace();
        }
    }
    /*
     *画面復帰時処理
     *
     */
    @Override
    public void onRestart() {
        super.onRestart();
    }
    /**
     * 画面終了処理
     */
    @Override
    protected void onDestroy(){
        super.onDestroy();
        try{
            CommManager.endAccept();
            CommManager.removeAcceptStatusListener(this);
        }catch (Exception e){
            //未接続状態で切断する際にエラー発生
            e.printStackTrace();
        }
        Log.v("LifeCycle", "onDestroy");
    }
    /*
     *戻るボタン押下時処理
     *
     */
    @Override
    public void onBackPressed() {
        new AlertDialog.Builder(QRReadActivity.this)
                .setMessage(getString(R.string.dialog_exit))
                .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        createCSV();
                    }
                })
                .setNegativeButton(getString(R.string.no), null)
                .show();
    }
    /*
     *画面終了時処理
     *
     */
    @Override
    protected void onPause() {
        super.onPause();
        overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    }
    /*
     *確定処理
     *
     */
    public void addData(){
        final DateFormat df = new SimpleDateFormat("yyyyMMddHHmm");
        final Date date = new Date(System.currentTimeMillis());
        DataList rowdata = new DataList();
        final String bar = et_barcode.getText().toString();
        final String tag = et_tagid.getText().toString();
        final String pro = et_product.getText().toString();
        //if(bar.trim().length()<=0){
        //    new AlertDialog.Builder(QRReadActivity.this)
        //            .setMessage(getString(R.string.qr_error_barcode))
        //            .setPositiveButton(getString(R.string.yes), null)
        //            .show();
        //    return;
        //}
        if(tag.trim().length()<=0){
            new AlertDialog.Builder(QRReadActivity.this)
                    .setMessage(getString(R.string.qr_error_tagid))
                    .setPositiveButton(getString(R.string.yes), null)
                    .show();
            return;
        }
        if(pro.trim().length()<=0){
            new AlertDialog.Builder(QRReadActivity.this)
                    .setMessage(getString(R.string.qr_error_product))
                    .setPositiveButton(getString(R.string.yes), null)
                    .show();
            return;
        }
        //タグ番号が重複するかチェック（重複時登録不可）
        if(doubleMap.size() > 0 ) {
            if (doubleMap.containsValue(tag) == false) {
                //バーコード番号が重複するかチェック（重複時上書き確認
                if (bar.length()>0 && doubleMap.containsKey(bar) == true) {
                    //上書き確認ダイアログを表示し「OK」であれば上書き登録
                    new AlertDialog.Builder(QRReadActivity.this)
                            .setMessage(getString(R.string.rf_dialog))
                            .setPositiveButton(getString(R.string.yes), new DialogInterface.OnClickListener() {
                                @Override
                                public void onClick(DialogInterface dialog, int which) {
                                    // OK button pressed
                                    DataList rowdata = new DataList();
                                    rowdata.setDateTime(df.format(date));
                                    rowdata.setBarcode(bar);
                                    rowdata.setTagID(tag);
                                    rowdata.setProductName(pro);
                                    doubleMap.remove(bar);
                                    doubleMap.put(bar, tag);
                                    //重複しているデータを削除する
                                    for (int i = 0; i < dataList.size(); i++) {
                                        if (dataList.get(i).getBarcode().equals(bar)) {
                                            dataList.remove(i);
                                        }
                                    }
                                    //新規で追加
                                    dataList.add(rowdata);
                                    //ダイアログ表示
                                    ShowDialog();
                                    refresh();
                                }
                            })
                            .setNegativeButton(getString(R.string.no), null)
                            .show();
                } else {
                    //何も重複が発生していないので、そのまま登録
                    //新規追加データ
                    rowdata.setDateTime(df.format(date));
                    rowdata.setBarcode(bar);
                    rowdata.setTagID(tag);
                    rowdata.setProductName(pro);
                    if(bar.length()==0){
                        doubleMap.put(String.valueOf(barcount), tag);
                        barcount++;
                    }else{
                        doubleMap.put(bar, tag);
                    }
                    dataList.add(rowdata);
                    //ダイアログ表示
                    ShowDialog();
                    refresh();
                }
            } else {
                //タグIDが重複している場合は登録不可
                //重複先のバーコード情報を直してもらうよう誘導
                String barcorde = "";
                for (String row : doubleMap.keySet()) {
                    if (doubleMap.get(row).equals(tag)) {
                        barcorde = row;
                    }
                }
                //登録不可ダイアログ
                new AlertDialog.Builder(QRReadActivity.this)
                        .setMessage(getString(R.string.rf_dialog_ng) + "\n(" + barcorde + ")\n"+getString(R.string.rf_dialog_ng2))
                        .setPositiveButton(getString(R.string.yes), null)
                        .show();
            }
        }else{
            //１件もマスタに存在しない場合はそのまま保存
            //新規追加データ
            rowdata.setDateTime(df.format(date));
            rowdata.setBarcode(bar);
            rowdata.setTagID(tag);
            rowdata.setProductName(pro);
            if(bar.length()==0){
                doubleMap.put(String.valueOf(barcount), tag);
                barcount++;
            }else{
                doubleMap.put(bar, tag);
            }
            dataList.add(rowdata);
            //ダイアログ表示
            ShowDialog();
            refresh();
        }
    }
    /*
     *画面項目のリフレッシュ
     * 登録完了するたびに実行
     *
     */
    public void refresh(){
        et_barcode.setText("");
        et_tagid.setText("");
        et_product.setText("");
        et_barcode.requestFocus();
    }
    /*
     *登録完了メッセージ出力
     *
     */
    public void ShowDialog(){
        boolean show_flg = false;
        if(mDialog == null){
            show_flg = true;
        }else if(!mDialog.isShowing()){
            show_flg = true;
        }
        if(show_flg){
            AlertDialog.Builder builder = null;
            builder = new AlertDialog.Builder(this, R.style.MyAlertDialogStyle);
            builder.setMessage(getString(R.string.qr_commit));
            builder.setCancelable(false);
            mDialog = builder.create();
            Handler handler = new Handler();
            Runnable dialogDismiss = new Runnable() {
                public void run() {
                    mDialog.dismiss();
                }
            };
            mDialog.show();
            TextView textView = (TextView) mDialog.findViewById(android.R.id.message);
            textView.setTextSize(30.0f);
            handler.postDelayed(dialogDismiss, 500);
        }
    }
    public void showCheckDialog() {
        List<String> listdata = new ArrayList<>();
        List<String> keylist = new ArrayList<>();
        for(String row:doubleMap.keySet()){
            listdata.add("【管理プレートNo】\n"+row+"\n【タグ番号】\n"+doubleMap.get(row)+"\n");
            keylist.add(row);
        }
        final List<String> keyList = keylist;
        final  String[] array = listdata.toArray(new String[listdata.size()]);
        AlertDialog.Builder builder = new AlertDialog.Builder(QRReadActivity.this)
                .setItems(array, null) // これだとアイテム選択で閉じる
                .setTitle("登録一覧です。問題なければOKで保存して終了")
                .setNegativeButton(android.R.string.cancel,null)
                .setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        createCSV();
                    }
                });
        final AlertDialog dlg = builder.create();
        dlg.getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
            @Override
            public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
                String key = keyList.get(position);
                String tag = doubleMap.get(key);
                doubleMap.remove(key);
                for(int i = 0; i<dataList.size();i++){
                    if(dataList.get(i).getTagID().equals(tag)){
                        dataList.remove(i);
                    }
                }
                dlg.dismiss();
                Toast.makeText(QRReadActivity.this,getString(R.string.qr_delete_result),Toast.LENGTH_SHORT).show();
                return false;
            }
        });
        dlg.show();
    }
}