package com.seuic.uhfdemo;

import java.util.ArrayList;
import java.util.List;

import com.seuic.scankey.IKeyEventCallback;
import com.seuic.scankey.ScanKeyService;
import com.seuic.scanner.Scanner;
import com.seuic.scanner.ScannerFactory;
import com.seuic.uhf.EPC;
import com.seuic.uhf.UHFService;

import android.app.Fragment;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.media.AudioManager;
import android.media.SoundPool;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.os.RemoteException;
import android.os.Vibrator;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;

import static android.media.AudioManager.STREAM_MUSIC;

public class InventoryFragement extends Fragment {

	public static final int MAX_LEN = 64;

	public static final int ItemSelectColor = 0x44000000;

	private UHFService mDevice;
	AudioManager audiomanage ;
	Vibrator vibrator;
	private InventoryRunable mInventoryRunable;
	public boolean mInventoryStart = false;
	private Thread mInventoryThread;
	private int mSelectedIndex = -1;
	private Button btn_once;
	private Button btn_continue;
	private Button btn_stop;
	private Button bt_Clear;
	private TextView tv_total;
	private ListView lv_id;
	HorizontalProgressBar mpb;
	private List<EPC> mEPCList;
	private InventoryAdapter mAdapter;
	Scanner mScanner;
	View currentView;
	private Thread mThread;
	static int m_count = 0;
	private static InventoryFragement inventoryfragement;
	public static InventoryFragement getInstance() {
		if (inventoryfragement == null)
			inventoryfragement = new InventoryFragement();
		return inventoryfragement;
	}

	private Handler handler = new Handler() {

		public void handleMessage(Message msg) {
			switch (msg.what) {
				case 1:
					synchronized (currentView.getContext()) {
						mEPCList = mDevice.getTagIDs();
					}
					refreshData();
					break;
				case 2:
					BtnOnce();
					handler.sendEmptyMessageDelayed(2, 200);
					break;
				case 3:
					BtnContinue();
					break;
				case 4:
					BtnStop();
					break;
				case 5:
					Log.i(TAG,"EPC ID"+msg.obj.toString());
					isCounitue=true;
					break;
				default:
					break;
			}
		};
	};

	// sound
	private static SoundPool mSoundPool;
	private static int soundID;
	public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
		mDevice = UHFService.getInstance(getActivity().getApplication());
		View view = initUI(inflater);
		mEPCList = new ArrayList<EPC>();
		mAdapter = new InventoryAdapter();
		mInventoryRunable = new InventoryRunable();
		lv_id.setAdapter(mAdapter);
		lv_id.setOnItemClickListener(new MyItemClickListener());
		mDevice.open();
		return view;
	}
	private ScanKeyService mScanKeyService = ScanKeyService.getInstance();
	private String TAG="zy";
	private IKeyEventCallback mCallback = new IKeyEventCallback.Stub() {
		@Override
		public void onKeyDown(int keyCode) throws RemoteException {
			/*开启连续寻卡*/
			Message message = Message.obtain();
			message.what = 3;
			handler.sendMessage(message);
			mThread = new Thread(mRunnable);
			mThread.start();
		}
		@Override
		public void onKeyUp(int keyCode) throws RemoteException {
			/*关闭连续寻卡*/
			Message message = Message.obtain();
			message.what = 4;
			handler.sendMessage(message);
			mThread.interrupt();
			mThread = null;
		}
	};

	@Override
	public void onResume() {
		super.onResume();
		audiomanage= (AudioManager)getActivity().getSystemService(Context.AUDIO_SERVICE);
		vibrator = (Vibrator)this.getActivity().getSystemService(Context.VIBRATOR_SERVICE);
		mScanKeyService.registerCallback(mCallback, "249,249,250");
		final IntentFilter filter = new IntentFilter();
		filter.addAction(Intent.ACTION_SCREEN_OFF);
		filter.addAction(Intent.ACTION_SCREEN_ON);
		InventoryFragement.getInstance().getActivity().registerReceiver(mBatInfoReceiver, filter);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		mScanKeyService.unregisterCallback(mCallback);
		InventoryFragement.getInstance().getActivity().unregisterReceiver(mBatInfoReceiver);
	}

	@Override
	public void onPause() {
		super.onPause();
	}

	public void closeAPP()
	{
		mScanKeyService.unregisterCallback(mCallback);
		mDevice.close();
	}

	// init UI
	private View initUI(LayoutInflater inflater) {
		currentView = inflater.inflate(R.layout.fragment_inventory, null);
		tv_total = (TextView) currentView.findViewById(R.id.tv_total);
		lv_id = (ListView) currentView.findViewById(R.id.lv_id);
		btn_once = (Button) currentView.findViewById(R.id.btn_once);
		btn_once.setOnClickListener(new MyClickListener());
		btn_continue = (Button) currentView.findViewById(R.id.bt_continue);
		btn_continue.setOnClickListener(new MyClickListener());
		btn_stop = (Button) currentView.findViewById(R.id.bt_stop);
		btn_stop.setOnClickListener(new MyClickListener());
		bt_Clear=(Button) currentView.findViewById(R.id.bt_Clear);
		bt_Clear.setOnClickListener(new MyClickListener());
		mpb = (HorizontalProgressBar)currentView.findViewById(R.id.mpb);
		mpb.setProgress(0);
		mpb.setMax(100);
		mSoundPool = new SoundPool(3, STREAM_MUSIC, 20);
		soundID = mSoundPool.load(currentView.getContext(), R.raw.scan, 1);
		return currentView;
	}

	private void refreshData() {
		if (mEPCList != null) {
			int count = 0;
			for (EPC item : mEPCList) {
				count += item.count;
			}
			if (count > m_count) {
				playSound();
			}
			mAdapter.notifyDataSetChanged();
			tv_total.setText(getString(R.string.id_pc_epc)+getString(R.string.total) + mEPCList.size());
			m_count = count;
		}
	}

	private class MyItemClickListener implements OnItemClickListener {
		public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
			mSelectedIndex = position;
			mAdapter.notifyDataSetInvalidated();
		}
	}

	private class MyClickListener implements android.view.View.OnClickListener {
		public void onClick(View v) {
			switch (v.getId()) {
				case R.id.btn_once:
					BtnOnce();
					break;
				case R.id.bt_continue:
					BtnContinue();
					break;
				case R.id.bt_stop:
					BtnStop();
					break;
				case R.id.bt_Clear:
					clearList();
					break;
				default:
					break;
			}
		}
	}

	private void BtnContinue() {
		mAdapter.notifyDataSetChanged();
		if (mInventoryThread != null && mInventoryThread.isAlive()) {
			System.out.println("Thread not null");
			return;
		}
		if (mDevice.inventoryStart()) {
			System.out.println("RfidInventoryStart sucess.");
			mInventoryStart = true;
			mInventoryThread = new Thread(mInventoryRunable);
			mInventoryThread.start();
			btn_continue.setEnabled(false);
			btn_once.setEnabled(false);
			btn_stop.setEnabled(true);
		} else {
			System.out.println("RfidInventoryStart faild.");
		}
		return;
	}

	private void BtnOnce() {
		EPC epc = new EPC();
		try {
			if (mDevice.inventoryOnce(epc, 500)) {
				String id = epc.getId();
				System.out.println("" + id);
				if (id != null && !"".equals(id)) {
					playSound();
					boolean exist = false;
					for (EPC item : mEPCList) {
						if (item.equals(epc)) {
							item.count++;
							exist = true;
							break;
						}
					}
					if (!exist) {
						mEPCList.add(epc);
					}
					refreshData();
				}
				System.out.println("OK!!!");
			}
		}catch (Exception w)
		{
			Log.i("zy",""+w.getMessage());
		}

	}

	private void BtnStop() {
		isCounitue=false;
		mInventoryStart = false;
		if (mInventoryThread != null) {
			mInventoryThread.interrupt();
			mInventoryThread = null;
		}
		if (mDevice.inventoryStop()) {
			btn_once.setEnabled(true);
			btn_continue.setEnabled(true);
			btn_stop.setEnabled(false);
		} else {
			Log.i(TAG,"RfidInventoryStop faild.");
		}
		return;
	}

	private void clearList() {
		mpb.setProgress(0);
		mSelectedIndex = -1;
		if (mEPCList != null) {
			mEPCList.clear();
			mAdapter.notifyDataSetChanged();
			m_count = 0;
		}
	}

	private void playSound() {
		if (mSoundPool == null) {
			mSoundPool = new SoundPool(3, STREAM_MUSIC, 20);
			soundID = mSoundPool.load(currentView.getContext(), R.raw.scan, 1);// "/system/media/audio/notifications/Antimony.ogg"
		}
		mSoundPool.play(soundID, 1, 1, 0, 0, 1);
	}

	private class InventoryAdapter extends BaseAdapter {
		@Override
		public int getCount() {

			// return 0;
			if (mEPCList != null) {
				return mEPCList.size();
			}
			return 0;
		}

		@Override
		public Object getItem(int position) {

			// return null;
			return mEPCList.get(position);
		}

		@Override
		public long getItemId(int position) {

			// return 0;
			return position;
		}

		@Override
		public void notifyDataSetChanged() {
			super.notifyDataSetChanged();
//			mSelectedIndex = -1;
		}

		@Override
		public View getView(int position, View convertView, ViewGroup parent) {
			View item_view = View.inflate(currentView.getContext(), R.layout.item_epc, null);
			EPC epc = mEPCList.get(position);

			TextView tv_id = (TextView) item_view.findViewById(R.id.tv_epc);
			TextView tv_nums = (TextView) item_view.findViewById(R.id.tv_nums);
			TextView tv_rssi = (TextView) item_view.findViewById(R.id.tv_rssi);

			tv_id.setText(epc.getId());
			tv_nums.setText(epc.count + "");
			tv_rssi.setText(epc.rssi + "");

			if (position == mSelectedIndex) {
				item_view.setBackgroundColor(ItemSelectColor);
			}
			return item_view;
		}

	}

	private class InventoryRunable implements Runnable {
		@Override
		public void run() {
			while (mInventoryStart) {
				if (mSelectedIndex >= 0) {
					Message message = Message.obtain();
					message.what = 5;
					message.obj=mEPCList.get(mSelectedIndex).getId();
					handler.sendMessage(message);
				}else {
					Message message = Message.obtain();
					message.what = 1;
					handler.sendMessage(message);
				}
				try {
					Thread.sleep(50);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
		}
	}

	private  int RSSI=0;
	private  int Times=0;
	List<EPC> epcList;
	List<String> s=new ArrayList<>();
	public boolean isCounitue=false;
	Runnable mRunnable = new Runnable() {
		@Override
		public void run() {
			while (true) {
				while (isCounitue) {
					try {
						synchronized (currentView.getContext()) {
							epcList=mDevice.getTagIDs();
							//s.add("sss");
						}
						for (int i = 0; i < epcList.size(); i++) {
							if (!mInventoryStart) {
								Log.i(TAG, "mInventoryStart：" + mInventoryStart);
								return;
							}
							if (mEPCList.get(mSelectedIndex).getId().equals(epcList.get(i).getId())) {
								int rssi = epcList.get(i).rssi;
								Log.i(TAG, epcList.get(i).getId() + "rssi：" + rssi);
								if(rssi<=-45 && rssi==RSSI){
									if(Times<=10){
										Times++;
									}else{
										rssi=-101;
										mpb.setProgress(2);
										mpb.setMax(100);
									}
								}else{
									RSSI=rssi;
									Times=0;
								}
								/*rssi between -70 and -60*/
								if (rssi>-100&&rssi <= -68) {
									audiomanage.setStreamVolume(STREAM_MUSIC,1,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(5);
									mpb.setMax(100);
									Thread.sleep(700);
								}
								/*rssi between -68 and  -64*/
								if (rssi > -68 && rssi <= -64) {
									audiomanage.setStreamVolume(STREAM_MUSIC,3,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(10);
									mpb.setMax(100);
									Thread.sleep(600);
								}
								if (rssi > -64 && rssi <= -60) {
									audiomanage.setStreamVolume(STREAM_MUSIC,3,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(20);
									mpb.setMax(100);
									Thread.sleep(400);
								}
								if (rssi > -60 && rssi <= -56) {
									audiomanage.setStreamVolume(STREAM_MUSIC,3,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(28);
									mpb.setMax(100);
									Thread.sleep(400);
								}
								if (rssi > -56 && rssi <= -52) {
									audiomanage.setStreamVolume(STREAM_MUSIC,3,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(35);
									mpb.setMax(100);
									Thread.sleep(400);
								}
								if (rssi > -52 && rssi <= -46) {
									audiomanage.setStreamVolume(STREAM_MUSIC,6,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(45);
									mpb.setMax(100);
									Thread.sleep(400);
								}
								if (rssi > -46 && rssi <= -42) {
									audiomanage.setStreamVolume(STREAM_MUSIC,6,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(55);
									mpb.setMax(100);
									Thread.sleep(300);
								}
								if (rssi > -42 && rssi <= -38) {
									audiomanage.setStreamVolume(STREAM_MUSIC,9,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(65);
									mpb.setMax(100);
									Thread.sleep(200);
								}
								if (rssi > -38 && rssi <= -34) {
									audiomanage.setStreamVolume(STREAM_MUSIC,9,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(75);
									mpb.setMax(100);
									Thread.sleep(200);
								}
								if (rssi > -34 && rssi <= -30) {
									audiomanage.setStreamVolume(STREAM_MUSIC,13,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(80);
									mpb.setMax(100);
									Thread.sleep(100);
								}
								if (rssi > -30 && rssi <= -25) {
									audiomanage.setStreamVolume(STREAM_MUSIC,15,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(90);
									mpb.setMax(100);
									Thread.sleep(20);
								}
								if (rssi > -25 && rssi <= -20) {
									audiomanage.setStreamVolume(STREAM_MUSIC,15,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(95);
									mpb.setMax(100);
									Thread.sleep(20);
								}
								if (rssi > -20) {
									audiomanage.setStreamVolume(STREAM_MUSIC,15,0);
									playSound();
									vibrator.vibrate(20);
									mpb.setProgress(100);
									mpb.setMax(100);
									Thread.sleep(20);
								}
							}
						}
					} catch (Exception e) {
						e.printStackTrace();
					}
				}
			}
		}
	};


	//监听 屏幕亮屏（息屏）状态
	private final BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(final Context context, final Intent intent) {
			final String action = intent.getAction();
			if(Intent.ACTION_SCREEN_ON.equals(action)){
				Log.i("zy","light");
				mDevice.open();
			}else if(Intent.ACTION_SCREEN_OFF.equals(action)) {
				Log.i("zy","sleep");
				mDevice.close();
			}
		}
	};

	/*单次寻卡*/
	private boolean isBegin=false;
	Runnable  run=new Runnable() {
		EPC epc = new EPC();
		@Override
		public void run() {
			while (true) {
				while (isBegin) {
					try {
						if (mDevice.inventoryOnce(epc, 800)) {
							Log.i(TAG, epc.getId() + "的信号强度：" + epc.rssi);
							if (epc.getId().equals(mEPCList.get(mSelectedIndex).getId())) {
								int rssi = epc.rssi;
								Log.i(TAG, epc.getId() + "的信号强度：" + rssi);
								/*信号强度在-60到-50之间：响1声*/
								if (rssi < -60) {
									playSound();
									audiomanage.setStreamVolume(STREAM_MUSIC,1,0);
									vibrator.vibrate(20);
									/*Thread.sleep(800);*/
								}
								/*信号强度在-60到-50之间：响1声*/
								if (rssi >= -60 && rssi <= -50) {
									playSound();
									audiomanage.setStreamVolume(STREAM_MUSIC,3,0);
									vibrator.vibrate(50);
									/*Thread.sleep(600);*/
								}
								/*信号强度在-50到-40之间：响2声*/
								if (rssi > -50 && rssi <= -40) {
									playSound();
									audiomanage.setStreamVolume(STREAM_MUSIC,6,0);
									vibrator.vibrate(100);
									/*Thread.sleep(400);*/
								}
								/*信号强度在-40到-30之间：响2声*/
								if (rssi > -40 && rssi <= -30) {
									playSound();
									audiomanage.setStreamVolume(STREAM_MUSIC,9,0);
									vibrator.vibrate(150);
									/*Thread.sleep(200);*/
								}
								/*信号强度在-30到-20之间：响2声*/
								if (rssi > -30) {
									playSound();
									audiomanage.setStreamVolume(STREAM_MUSIC,15,0);
									vibrator.vibrate(200);
									/*Thread.sleep(20);*/
								}
							}
						}
						else {
							Log.i(TAG, "inventoryOnce 失败" );
						}
					}catch (Exception e){
						e.printStackTrace();
					}
					finally {
						try {
							Thread.sleep(50);
						} catch (InterruptedException e) {
							e.printStackTrace();
						}
					}
				}
			}
		}
	};

}
