package com.android.pc.ioc.update;

import java.io.File;

import android.app.Notification;
import android.app.NotificationManager;
import android.app.PendingIntent;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.PackageManager.NameNotFoundException;
import android.net.Uri;
import android.widget.RemoteViews;

import com.android.pc.ioc.app.Ioc;

public class NotificationHelper {

	private Context mContext;
	private RemoteViews mRemoteViews;
	private Notification mDownProgrNotif;
	private PackageHelper mPackageHelper;
	private NotificationManager mContextNotificationManager;
	private int layout_id;
	private int icon_id;
	private int progress_id;
	private int progress_txt_id;
	private int id;
	private Class clazz;

	public NotificationHelper(Context ctx, int layout_id, int icon_id, int progress_id, int progress_txt_id, Class clazz) {
		this.mContext = ctx;
		this.mPackageHelper = new PackageHelper();
		this.mContextNotificationManager = (NotificationManager) ctx.getSystemService(Context.NOTIFICATION_SERVICE);
		this.layout_id = layout_id;
		this.icon_id = icon_id;
		this.progress_id = progress_id;
		this.progress_txt_id = progress_txt_id;
		this.clazz = clazz;
		id = Integer.valueOf((System.currentTimeMillis() + "").substring(4));
	}

	public void initNotif() {
		mDownProgrNotif = new Notification();
		mDownProgrNotif.icon = android.R.drawable.stat_sys_download;
		mDownProgrNotif.flags |= Notification.FLAG_ONGOING_EVENT;

		mRemoteViews = new RemoteViews(mPackageHelper.getPackageName(), layout_id);
		mRemoteViews.setImageViewResource(icon_id, mPackageHelper.getAppIcon());

		mDownProgrNotif.contentView = mRemoteViews;
		Intent intent = null;
		if (clazz != null) {
			intent = new Intent(Ioc.getIoc().getApplication(), clazz);
		}
		mDownProgrNotif.contentIntent = PendingIntent.getService(mContext, 0, intent == null ? new Intent() : intent, 0);
		// mContextNotificationManager.notify(id, mDownProgrNotif);
	}

	private Notification getDownFinishedNotification(File file) {
		Intent intent = new Intent(Intent.ACTION_VIEW);
		intent.setDataAndType(Uri.fromFile(file), "application/vnd.android.package-archive");
		PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
		Notification noti = new Notification();
		noti.setLatestEventInfo(mContext, mPackageHelper.getAppName(), "下载完成,点击安装", pendingIntent);
		noti.icon = android.R.drawable.stat_sys_download_done;
		noti.flags = Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS;
		return noti;
	}

	/**
	 * 下载成功或者失败以后 刷新顶部通知栏
	 * 
	 * @author gdpancheng@gmail.com 2014-3-2 下午11:33:43
	 * @return Notification
	 */
	public void downShowNotification(String text) {
		Intent intent = new Intent();
		if (clazz != null) {
			intent = new Intent(Ioc.getIoc().getApplication(), clazz);
			intent.addCategory(Intent.CATEGORY_LAUNCHER);
			intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_RESET_TASK_IF_NEEDED);
		}
		PendingIntent pendingIntent = PendingIntent.getActivity(mContext, 0, intent, 0);
		Notification noti = new Notification();
		noti.setLatestEventInfo(mContext, mPackageHelper.getAppName(), text, pendingIntent);
		noti.icon = android.R.drawable.stat_sys_download_done;
		noti.flags = Notification.FLAG_AUTO_CANCEL | Notification.DEFAULT_SOUND | Notification.DEFAULT_LIGHTS;
		mContextNotificationManager.notify(id, noti);
	}

	/**
	 * 下载中 这个是不支持断点下载的 所以无法显示进度
	 * 
	 * @author gdpancheng@gmail.com 2014-3-2 下午11:33:43
	 * @return Notification
	 */
	public void downNotification(String text) {
		Notification notfi = new Notification();
		notfi.icon = android.R.drawable.stat_sys_download;
		notfi.flags |= Notification.FLAG_ONGOING_EVENT;
		Intent intent = null;
		if (clazz != null) {
			intent = new Intent(Ioc.getIoc().getApplication(), clazz);
		}
		PendingIntent pendingIntent = PendingIntent.getService(mContext, 0, intent == null ? new Intent() : intent, 0);
		notfi.setLatestEventInfo(mContext, mPackageHelper.getAppName(), text, pendingIntent);
		mContextNotificationManager.notify(id, notfi);
	}

	public void cancel() {
		mContextNotificationManager.cancel(id);
	}

	/**
	 * 更新下载进度
	 * 
	 * @param percent
	 */
	public void refreshProgress(float percent) {
		mRemoteViews.setProgressBar(progress_id, 100, (int) percent, false);
		mRemoteViews.setTextViewText(progress_txt_id, String.format("%.1f", percent));
		mContextNotificationManager.notify(id, mDownProgrNotif);
	}

	/**
	 * 通知用户下载已经完成
	 * 
	 * @param file
	 */
	public void notifyUpdateFinish(File file) {
		mContextNotificationManager.notify(id, getDownFinishedNotification(file));
	}

	class PackageHelper {
		private PackageInfo info = null;
		private PackageManager pm;

		public PackageHelper() {
			pm = Ioc.getIoc().getApplication().getPackageManager();
			try {
				info = pm.getPackageInfo(Ioc.getIoc().getApplication().getPackageName(), 0);
			} catch (NameNotFoundException e) {
				e.printStackTrace();
			}
		}

		public String getAppName() {
			return info != null ? (String) info.applicationInfo.loadLabel(pm) : "";
		}

		public String getPackageName() {
			return info != null ? info.packageName : "";
		}

		public int getAppIcon() {
			return info != null ? info.applicationInfo.icon : android.R.drawable.ic_dialog_info;
		}
	}
}
