package org.auie.base;

import java.util.Locale;

import org.auie.annotation.UEAnnotation.UEConfig;
import org.auie.annotation.UEAnnotation.UELayout;
import org.auie.annotation.UEAnnotationManager;
import org.auie.ui.UIBatteryView;
import org.auie.ui.UINavigationView;
import org.auie.ui.UISingalView;
import org.auie.utils.UE;
import org.auie.utils.UEDevice;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.content.res.XmlResourceParser;
import android.graphics.Typeface;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.os.BatteryManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.telephony.PhoneStateListener;
import android.telephony.SignalStrength;
import android.telephony.TelephonyManager;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.view.Window;
import android.view.WindowManager;

public abstract class UENavigationFragmentActivity extends FragmentActivity implements OnClickListener{

	private IntentFilter batteryFilter = new IntentFilter(Intent.ACTION_BATTERY_CHANGED);
	private IntentFilter wifiFilter = new IntentFilter(WifiManager.RSSI_CHANGED_ACTION);
	
	//全局Activity对象,可当作context使用
	//(Global Activity Object, can be used as Context)
	public final Activity activity = this;
	
	private SingalListener mSingalListener = new SingalListener();
	private UINavigationView mNavigationView;
	private TelephonyManager mTelephonyManager;
	
	/**
	 * 复写onCreat方法,调用初始化入口方法,严禁复写
	 * (calling initialization entrance method, it's strictly prohibited to override)
	 */
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		initializePrepare();	//初始化准备
		initializeBegin(); 		//初始化开始
		initializeFinish();		//初始化结束
	}
	
	/**
	 * 初始化开始方法
	 * (Initialization begins)
	 */
	private void initializeBegin() {
		wifiFilter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
		mNavigationView = new UINavigationView(this);
		mNavigationView.setNetworkText(UEDevice.getNetworkType(activity));
		mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
		mTelephonyManager.listen(mSingalListener, PhoneStateListener.LISTEN_SIGNAL_STRENGTHS);
		setContentView(mNavigationView, new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		if (getClass().isAnnotationPresent(UELayout.class)) {
			int layout = -1;
			UELayout initialization = getClass().getAnnotation(UELayout.class);
			if (initialization.value() != -1) {
				layout = initialization.value();
			} else {
				try{
					layout = getResources().getIdentifier(getClass().getSimpleName().toLowerCase(Locale.getDefault()), "layout", getPackageName());
					if (layout == 0) {
						Log.e("AUIE", "资源错误 - 未找到名为" + getClass().getSimpleName().toLowerCase(Locale.getDefault()) + ".xml的布局文件");
					}
				} catch (Exception e){
					Log.d("AUIE", e.getMessage());
				}
			}
			View view = LayoutInflater.from(activity).inflate(layout, mNavigationView, false);
			mNavigationView.addView(view);
		}
		if (getClass().isAnnotationPresent(UEConfig.class)) {
			int config = getClass().getAnnotation(UEConfig.class).value();
			if (config != -1) {
				readXML(config);
			}
		}
		UEAnnotationManager.getInstance().initialize(this, false);
	}

	/**
	 * 读取XML配置文件
	 * @param id 配置文件索引
	 */
	private void readXML(int id){
		String name;
		String className = getClass().getSimpleName();
		XmlResourceParser xrp = getResources().getXml(id);
		try {
			while(xrp.getEventType() != XmlResourceParser.END_DOCUMENT){
				if (xrp.getEventType() == XmlResourceParser.START_TAG) {
					name = xrp.getName();
					if (name.equals("BackgroundColor")) {
						mNavigationView.setBackgroundColor(xrp.getAttributeIntValue(0, mNavigationView.getBackgroundColor()));
					}
					if (name.equals("StatusType")) {
						mNavigationView.setStatusType(xrp.getAttributeIntValue(0, mNavigationView.getStatusType()));
					}
					if (name.equals("TitleColor")) {
						mNavigationView.setTitleColor(xrp.getAttributeIntValue(0, mNavigationView.getTitleColor()));
					}
					if (name.equals("LineBackgroundColor")) {
						mNavigationView.setLineBackgroundColor(xrp.getAttributeIntValue(0, mNavigationView.getTitleColor()));
					}
					if (name.equals("NavigationTextColor")) {
						mNavigationView.setNavigationTextColor(xrp.getAttributeIntValue(0, mNavigationView.getNavigationTextColor()));
					}
					if (name.equals("Title") && xrp.getAttributeValue(0).equals(className)) {
						mNavigationView.setTitle(xrp.getAttributeValue(1));
					}
				}
				xrp.next();
			}
		} catch (Exception e) {
			Log.d(UE.TAG, "UEConfig配置出错"+e.toString());
		}
	}
	
	
	/**
	 * 初始化准备方法
	 * (Initialization prepares, here you can perform some method)
	 */
	protected void initializePrepare() {
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		getWindow().setFlags(WindowManager.LayoutParams. FLAG_FULLSCREEN ,WindowManager.LayoutParams. FLAG_FULLSCREEN);
	}

	/**
	 * 实现OnClickListener接口
	 * (Perform onClickListener)
	 */
	@Override
	public void onClick(View v) {}
	
	public void setLeftImageResource(int resId){
		mNavigationView.setLeftImageResource(resId);
	}
	
	public void setLeftText(String text){
		mNavigationView.setLeftText(text);
	}
	
	@Override
	public void setTitle(int titleId) {
		mNavigationView.setTitle(getResources().getString(titleId));
	}

	@Override
	public void setTitle(CharSequence title) {
		mNavigationView.setTitle(title.toString());
	}

	public void setTitle(String title){
		mNavigationView.setTitle(title);
	}
	
	public void setLeftOnClickListener(OnClickListener mListener){
		mNavigationView.setLeftOnClickListener(mListener);
	}
	
	public void setLeftDefaultOnClickListener(Activity activity){
		mNavigationView.setLeftDefaultOnClickListener(activity);
	}
	
	public void setRightOnClickListener(OnClickListener mListener){
		mNavigationView.setRightOnClickListener(mListener);
	}
	
	public void setRightImageResource(int resId) {
		mNavigationView.setRightImageResource(resId);
	}
	
	public void setRightText(String text){
		mNavigationView.setRightText(text);
	}
	
	public void setStatusBarBackgroundColor(int statusBarBackgroundColor) {
		mNavigationView.setStatusBarBackgroundColor(statusBarBackgroundColor);
	}

	public void setNavigationBarBackgroundColor(int navigationBarBackgroundColor) {
		mNavigationView.setNavigationBarBackgroundColor(navigationBarBackgroundColor);
	}
	
	public void setBackgroundColor(int backgroundColor) {
		mNavigationView.setBackgroundColor(backgroundColor);
	}
	
	public void setLineBackgroundColor(int lineBackgroundColor) {
		mNavigationView.setLineBackgroundColor(lineBackgroundColor);
	}
	
	public void setStatusType(int statusType) {
		mNavigationView.setStatusType(statusType);
	}

	public void setNavigationTextColor(int navigationTextColor) {
		mNavigationView.setNavigationTextColor(navigationTextColor);
	}

	public void setTitleColor(int titleColor) {
		mNavigationView.setTitleColor(titleColor);
	}
	
	public void showNavigationBar(){
		showStatusBar();
		showActionBar();
	}
	
	public void hideNavigationBar(){
		hideStatusBar();
		hideActionBar();
	}
	
	public void hideStatusBar(){
		mNavigationView.hideStatusBar();
	}
	
	public void hideActionBar(){
		mNavigationView.hideActionBar();
	}
	
	public void showStatusBar(){
		mNavigationView.showStatusBar();
	}
	
	public void showActionBar(){
		mNavigationView.showActionBar();
	}
	
	public void addNotice(String content){
		mNavigationView.addNotice(content);
	}
	
	public void addNotice(String content, long time){
		mNavigationView.addNotice(content, time);
	}

	public void clearNotice(){
		mNavigationView.clearNotice();
	}
	
	protected abstract void initializeFinish();
	
	private BroadcastReceiver wifiReceiver  = new BroadcastReceiver() {

		@Override
		public void onReceive(Context context, Intent intent) {
			WifiInfo info = ((WifiManager) context.getSystemService(Context.WIFI_SERVICE)).getConnectionInfo();
			if (info.getBSSID() == null) {
				mNavigationView.hideWIFI();
			}else {
				mNavigationView.showWIFI();
				mNavigationView.setWIFI(WifiManager.calculateSignalLevel(info.getRssi(), 5));
			}
		}
		
	};
	
	private BroadcastReceiver batteryReceiver  = new BroadcastReceiver() {
		@Override
		public void onReceive(Context context, Intent intent) {
			int level = intent.getIntExtra("level", -1);
            int status = intent.getIntExtra("status", -1);
            switch (status) {
			case BatteryManager.BATTERY_STATUS_FULL:
				mNavigationView.setStatus(UIBatteryView.STATUS_COMLETED);
				mNavigationView.setBatteryText("已充满");
				break;
			case BatteryManager.BATTERY_STATUS_CHARGING:
				mNavigationView.setStatus(UIBatteryView.STATUS_CHARGED);
				mNavigationView.setBatteryText("充电中");
				break;
			case BatteryManager.BATTERY_STATUS_DISCHARGING:
			case BatteryManager.BATTERY_STATUS_NOT_CHARGING:
				mNavigationView.setLevel(level * 0.01f);
				mNavigationView.setBatteryText(level + "%");
				break;
			default:
				mNavigationView.setLevel(0);
				mNavigationView.setBatteryText("无电池");
				break;
			}
		}
	};

	class SingalListener extends PhoneStateListener{

		@Override
		public void onSignalStrengthsChanged(SignalStrength signalStrength) {
			super.onSignalStrengthsChanged(signalStrength);
			String sim = UEDevice.getSimType(activity);
			mNavigationView.setSingalText(sim);
			if (sim.equals("无服务")) {
				mNavigationView.setSingalStatus(UISingalView.STATUS_NONE);
				return;
			}
			mNavigationView.setSingalStatus(UISingalView.STATUS_NORMAL);
			int level = 0;
			if (signalStrength.isGsm()) {
				level = signalStrength.getGsmSignalStrength();
			}else {
				if (sim.equals("中国电信")) {
					level = signalStrength.getCdmaDbm();
				}else {
					level = signalStrength.getEvdoDbm();
				}
			}
			if (level == 0) {
				mNavigationView.setSignal(5);
				return;
			}
			if (level < -112) {
				mNavigationView.setSignal(0);
			}else if (level >= -111 && level < -104) {
				mNavigationView.setSignal(1);
			}else if (level >= -104 && level < -97) {
				mNavigationView.setSignal(2);
			}else if (level >= -97 && level < -90) {
				mNavigationView.setSignal(3);
			}else if (level >= -90 && level < -83) {
				mNavigationView.setSignal(4);
			}else {
				mNavigationView.setSignal(5);
			}
		}
		
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		registerReceiver(batteryReceiver, batteryFilter);
		registerReceiver(wifiReceiver, wifiFilter);
	}

	@Override
	protected void onPause() {
		super.onPause();
		unregisterReceiver(batteryReceiver);
		unregisterReceiver(wifiReceiver);
	}
	
	/**
	 * 无传递参数简单跳转Activity方法
	 * (Form this Activity to other Activity, it's not incidental parameters)
	 * @param clazz 将要跳转的目的地(Other Activity - Destination)
	 * @param isClose 完成后是否关闭此类(Whether to close the current Activity)
	 */
	public void startActivity(Class<?> clazz, boolean isClose){
		startActivity(new Intent(this, clazz));
		if (isClose) {
			finish();
		}
	}
	
	/**
	 * 自定义字体方法
	 * @param typeface 自定义字体
	 */
	protected void initializeFont(Typeface typeface) {
		UEAnnotationManager.getInstance().initializeFont(activity, typeface);
	}

	/**
	 * 简单跳转Activity方法
	 * @param intent 将要跳转的目的地
	 * @param isClose 完成后是否关闭此类
	 */
	public void startActivity(Intent intent, boolean isClose){
		startActivity(intent);
		if (isClose) {
			finish();
		}
	}
	
}