package com.gizwits.opensource.devicecontrol.ui.activity;

import java.util.concurrent.ConcurrentHashMap;
import com.gizwits.gizwifisdk.api.GizWifiDevice;
import com.gizwits.gizwifisdk.enumration.GizWifiDeviceNetStatus;
import com.gizwits.gizwifisdk.enumration.GizWifiErrorCode;
import com.gizwits.opensource.smartlight.R;
import com.gizwits.opensource.devicecontrol.ui.view.ColorCircularSeekBar;
import com.gizwits.opensource.devicecontrol.ui.view.ColorTempCircularSeekBar;

import android.annotation.SuppressLint;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.SeekBar;
import android.widget.TextView;
import android.widget.SeekBar.OnSeekBarChangeListener;

public class GosDeviceControlActivity extends GosDeviceControlModuleBaseActivity implements OnClickListener{

	/** 返回按钮 */
	private ImageView ivBack;
	
	/** 标题TextView */
	private TextView tvTitle;
	
	/** 设置按钮 */
	private ImageView ivSetting;
	
	/** 延时功能布局 */
	private RelativeLayout rlDelay;
	
	/** 延时TextView */
	private TextView tvDelay;
	
	/** 开关按钮 */
	private Button btnPower;
	
	/** 开关TextView */
	private TextView tvPower;
	
	/** 整个布局覆盖ImageView */
	private ImageView ivmain;
	
	/** 整个布局 */
	private RelativeLayout rl_middle;
	
	/** 关灯布局ImageView */
	private ImageView ivPowerOff;
	
	/** 中部UI布局 */
	private RelativeLayout rl_top;
	
	/** 模式切换按钮 */
	private Button btnmode;
		
	/** 色彩进度条*/
	private ColorCircularSeekBar circularSeekBar;
	
	/** 色温进度条*/
	private ColorTempCircularSeekBar colorTempCircularSeekBar;
	
	/** 亮度进度条 */
	private SeekBar sbBrighteness;
	
	private Runnable mRunnable = new Runnable() {
		public void run() {
			if (isDeviceCanBeControlled()) {
				progressDialog.cancel();
			} else {
				handler.sendEmptyMessage(handler_key.DEV_NOREADY.ordinal());
			}
		}

	};
	private enum handler_key {
		/** 获取设备状态*/
		GET_DEV_STUAT,
		
		/** 接收到设备的数据 */
		RECEIVED,

		/** 设备未就绪 */
		DEV_NOREADY,
	}

	@SuppressLint("HandlerLeak")
	Handler handler = new Handler() {
		@Override
		public void handleMessage(Message msg) {
			super.handleMessage(msg);
			handler_key key = handler_key.values()[msg.what];
			switch (key) {
			case GET_DEV_STUAT:
				device.getDeviceStatus();
				break;
			case DEV_NOREADY:
				toastDeviceNoReadyAndExit();
				break;
			case RECEIVED:
				progressDialog.cancel();
				getDataFromDateMap();
				upDateUI();
				break;
			default:
				break;
			}
		}

	};
	
	protected void upDateUI() {
		updateTitle();
		updatePowerUI(isPowerOn);
		updateMode(mode_num);
		updateColor(Color.argb(255,color_num_r, color_num_g, color_num_b));
		updateColortemp(Color.argb(255,color_num_temp_r, color_num_temp_g, color_num_temp_b));
		updateBrighteness(bringhtness_num);
		updateDelayUI(isOpenDelaying);
	}
	
	private void updateTitle() {
		tvTitle.setText(getDeviceName());		
	}
	
	/**
	 * 更新电源开关切换.
	 */
	private void updatePowerUI(boolean isPower) {
		if (!isPower) {
			btnPower.setSelected(true);
			tvPower.setText(getString(R.string.openlight));
			ivmain.setVisibility(View.VISIBLE);
			rl_top.setVisibility(View.VISIBLE);	
		} else {
			btnPower.setSelected(false);
			tvPower.setText(getString(R.string.closelight));			
			ivPowerOff.setVisibility(View.INVISIBLE);
			rl_middle.setVisibility(View.VISIBLE);
			ivmain.setVisibility(View.INVISIBLE);
		}
	}
	
	/**
	 * 更新模式切换.
	 */
	private void updateMode(Integer mode_num) {
		device.getAlias();
		switch (mode_num) {
		case 0:
			btnmode.setSelected(true);//home_btn_color		
			circularSeekBar.ShowSeekBar();
			circularSeekBar.setVisibility(View.VISIBLE);
			colorTempCircularSeekBar.setVisibility(View.GONE);
			break;
		case 1:
			btnmode.setSelected(false);//home_btn_color_temperature
			circularSeekBar.hideSeekBar();
			circularSeekBar.setVisibility(View.GONE);
			colorTempCircularSeekBar.setVisibility(View.VISIBLE);
			break;
		}	
	}
	
	/*
	 * 更新色彩
	 */
	private void updateColor(int color) {
		circularSeekBar.setInnerColor(Color.argb(255,color_num_r, color_num_g, color_num_b));	

	}
	
	/*
	 * 更新色温
	 */
	private void updateColortemp(int color) {
		colorTempCircularSeekBar.setInnerColor(Color.argb(255,color_num_temp_r, color_num_temp_g, color_num_temp_b));

	}
	/*
	 * 更新亮度值
	 */
	private void updateBrighteness(int bringhtness_num) {
		
		sbBrighteness.setProgress(bringhtness_num);
	}

	/*
	 * 更新延时
	 */
	private void updateDelayUI(Boolean isShow) {
		if (isShow) {			
			tvDelay.setText(countDownMinute + getResources().getString(R.string.apm_min_later));
			rlDelay.setVisibility(View.VISIBLE);
		} else {
			rlDelay.setVisibility(View.GONE);
		}		
	}
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_comd_light_device_control);		
		initView();
		initEvent();
		initDevice();		
		upDateUI();
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		// 每次界面可视时候将获取重新获取设备装备
		getStatusOfSocket();
		upDateUI();
	}
	
	@Override
	protected void onDestroy() {
		// TODO Auto-generated method stub
		super.onDestroy();
		device.setSubscribe(false);
	}

	private void toastDeviceNoReadyAndExit() {
		myToast(R.string.device_no_ready);
		finish();
	}
	
	private boolean isDeviceCanBeControlled() {
		return device.getNetStatus() == GizWifiDeviceNetStatus.GizDeviceControlled;
	}
	
	/**
	 * Description:判断当前设备是否可控.
	 */
	private void getStatusOfSocket() {

		// 设备是否可控
		if (isDeviceCanBeControlled()) {
			// 可控则查询当前设备状态
			device.getDeviceStatus();
		} else {
			// 显示等待栏
			setProgressDialog(getResources().getString(R.string.wait_for_connet), true, false);
			progressDialog.show();
			if (device.isLAN()) {
				// 小循环10s未连接上设备自动退出
				handler.postDelayed(mRunnable, 10000);
			} else {
				// 大循环20s未连接上设备自动退出
				handler.postDelayed(mRunnable, 20000);
			}
		}
	}
	
	private void initView() {
		ivBack = (ImageView) findViewById(R.id.iv_back);
		tvTitle = (TextView) findViewById(R.id.tvTitle);
		ivSetting = (ImageView) findViewById(R.id.ivSetting);
		btnPower = (Button) findViewById(R.id.btnPower);
		tvPower = (TextView) findViewById(R.id.tvPower);
		rl_top = (RelativeLayout) findViewById(R.id.rl_top);
		ivmain = (ImageView) findViewById(R.id.ivmain);
		rl_middle = (RelativeLayout) findViewById(R.id.rl_middle);
		ivPowerOff = (ImageView) findViewById(R.id.ivPowerOff);
		//延时预约
		rlDelay = (RelativeLayout) findViewById(R.id.rlDelay);
		tvDelay = (TextView) findViewById(R.id.tvDelay);	
		//模式切换
		btnmode = (Button) findViewById(R.id.btnmode);
		//色彩的进度条
		circularSeekBar = (ColorCircularSeekBar) findViewById(R.id.csbSeekbar2);
		circularSeekBar.postInvalidateDelayed(2000);
		circularSeekBar.setMaxProgress(100);
		circularSeekBar.setProgress(30);
		circularSeekBar.setMProgress(0);
		circularSeekBar.postInvalidateDelayed(100);
		circularSeekBar.setSeekBarChangeListener(new ColorCircularSeekBar.OnSeekChangeListener() {
			@Override
			public void onProgressChange(ColorCircularSeekBar view, int color) {
				// TODO Auto-generated method stub
					//color_num=color;
					cColor(device, color);							
				}
							
		});						
		//色温的进度条
		colorTempCircularSeekBar = (ColorTempCircularSeekBar) findViewById(R.id.csbSeekbar);//色温
		colorTempCircularSeekBar.postInvalidateDelayed(2000);
		colorTempCircularSeekBar.setMaxProgress(100);
		colorTempCircularSeekBar.setProgress(30);
		colorTempCircularSeekBar.setMProgress(0);
		colorTempCircularSeekBar.postInvalidateDelayed(100);
		colorTempCircularSeekBar.setSeekBarChangeListener(new ColorTempCircularSeekBar.OnSeekChangeListener() {
		
			@Override
			public void onProgressChange(ColorTempCircularSeekBar view, int color) {
				// TODO Auto-generated method stub
					cColorTemp(device, color);			
				}
									
		});
		//亮度
		sbBrighteness = (SeekBar) findViewById(R.id.sbBrighteness);
		sbBrighteness.setOnSeekBarChangeListener(new OnSeekBarChangeListener() {
			@Override
			public void onStopTrackingTouch(SeekBar seekBar) {
				bringhtness_num = seekBar.getProgress();
				cBrightness( device, seekBar.getProgress());				
			}
			@Override
			public void onStartTrackingTouch(SeekBar seekBar) {
				
			}
			@Override
			public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) {
				
			}
		});
	}
	
	private void initEvent() {
		ivBack.setOnClickListener(this);
		ivSetting.setOnClickListener(this);
		btnPower.setOnClickListener(this);
		btnmode.setOnClickListener(this);
	}
	
	private void initDevice() {
		Intent intent = getIntent();
		GizWifiDevice dev = (GizWifiDevice) intent.getParcelableExtra("GizWifiDevice");
		if (dev != null) {
			device = dev;
			device.setListener(gizWifiDeviceListener);
		} else {
			toastDeviceNoReadyAndExit();
		}
	}
	
	@Override
	public void onClick(View v) {
		// TODO Auto-generated method stub
		switch (v.getId()) {
		case R.id.iv_back:
			finish();	
			break;
		case R.id.ivSetting:
			startDeviceSettingActivity();
			break;
		case R.id.btnPower:
			btnPowerAction();
			break;
		case R.id.btnmode:
			btnModeAction();
			break;
		default:
			break;
		}
	}
					
	private void startDeviceSettingActivity() {
		startActivity(new Intent(this, GosDeviceMoreActivity.class));
	}
	
	/* 开关*/
	private void btnPowerAction() {
		sendCommand("Power_Switch", !isPowerOn);		
		isPowerOn =!isPowerOn;		
		if (!isPowerOn == true) {
			btnPowerOff();
		} else {
			ivPowerOff.setVisibility(View.INVISIBLE);
			rl_middle.setVisibility(View.VISIBLE);
			ivmain.setVisibility(View.INVISIBLE);
		}
	}
	
	/* 模式*/
	private void btnModeAction() {
		device.getAlias();
		if (mode_num == 0) {
			btnmode.setSelected(false);//home_btn_color_temperature
			circularSeekBar.setVisibility(View.GONE);
			colorTempCircularSeekBar.setVisibility(View.VISIBLE);
			mode_num = 1;
		} else {			
			btnmode.setSelected(true);//home_btn_color
			circularSeekBar.setVisibility(View.VISIBLE);
			colorTempCircularSeekBar.setVisibility(View.GONE);
			mode_num = 0;
		}
		sendCommand("mode", mode_num);
	}
	
	/* 色彩*/
	public void cColor(GizWifiDevice device, int color){
		sendMoreCommand("Color_R", Color.red(color), 
				"Color_G", Color.green(color), "Color_B", Color.blue(color));
		color_num_r = Color.red(color);
		color_num_g = Color.green(color);
		color_num_b = Color.blue(color);
	}
				
	/* 色温*/
	public void cColorTemp(GizWifiDevice device, int color_num){
		sendMoreCommand("Temperature_R", Color.red(color_num), 
				"Temperature_G", Color.green(color_num), "Temperature_B", Color.blue(color_num));
		color_num_temp_r = Color.red(color_num);
		color_num_temp_g = Color.green(color_num);
		color_num_temp_b = Color.blue(color_num);
	}
		
	/* 亮度*/
	public void cBrightness( GizWifiDevice device, int bringhtness_num) {
		sendCommand("Brightness", bringhtness_num);	
	}	
	
	public void sendMoreCommand(String key, Object value,String key1, Object value1,String key2, Object value2) {
//		int sn = 5; // 如果App不使用sn,此处可写成 int sn = 0;
		int sn = 0;
		ConcurrentHashMap<String, Object> command = new ConcurrentHashMap<String, Object>();
		command.put(key, value);
		command.put(key1, value1);
		command.put(key2, value2);		
		device.write(command, sn);
	}
	
	private void btnPowerOff() {
		ivmain.setVisibility(View.VISIBLE);
		rl_top.setVisibility(View.VISIBLE);
		powerOff();
	}
	
	private void powerOff() {		
		Bitmap mBitmap = Bitmap.createBitmap(rl_middle.getWidth(), rl_middle.getHeight(), Config.ARGB_8888);
		Canvas canvas = new Canvas(mBitmap);
		rl_middle.draw(canvas);
		ivPowerOff.setVisibility(View.VISIBLE);
		ivPowerOff.setImageBitmap(mBitmap);
		rl_middle.setVisibility(View.INVISIBLE);
		
	}
		
	@Override
	protected void didReceiveData(GizWifiErrorCode result, GizWifiDevice device,
			ConcurrentHashMap<String, Object> dataMap, int sn) {
		super.didReceiveData(result, device, dataMap, sn);
		if (result == GizWifiErrorCode.GIZ_SDK_SUCCESS) {
			deviceDataMap = dataMap;
			handler.sendEmptyMessage(handler_key.RECEIVED.ordinal());
		}
	}
	
	@Override
	protected void didUpdateNetStatus(GizWifiDevice device, GizWifiDeviceNetStatus netStatus) {
		super.didUpdateNetStatus(device, netStatus);
		if (device.isSubscribed()) {
			if (netStatus == GizWifiDeviceNetStatus.GizDeviceControlled) {
				handler.removeCallbacks(mRunnable);
				progressDialog.cancel();
				// 后面操作是等待sdk下发查询设备状态命令,收到设备状态后再更新界面
			} else {
				myToast(R.string.device_dropped);
				finish();
			}
		}
	}

}