/*******************************************************************************
 * Copyright (c) 2013, 2017 Orange.
 * All rights reserved. This program and the accompanying materials
 * are made available under the terms of the Eclipse Public License 2.0
 * which accompanies this distribution, and is available at
 * https://www.eclipse.org/legal/epl-2.0/
 *
 * Contributors:
 *    BAREAU Cyrille <cyrille.bareau@orange.com>, 
 *    BONNARDEL Gregory <gbonnardel.ext@orange.com>, 
 *    BOLLE Sebastien <sebastien.bolle@orange.com>.
 *******************************************************************************/
package org.eclipse.om2m.android.dashboard.main;

import java.io.InputStream;

import org.eclipse.om2m.android.dashboard.applications.ApplicationConfigActivity;
import org.eclipse.om2m.android.dashboard.cse.models.OneM2MApplication;

import org.eclipse.om2m.android.dashboard.R;

import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.util.AttributeSet;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class MainAppEntryView extends LinearLayout {

	private TextView tvAppName;
	private ImageView ivAppIcon;
	private RelativeLayout rlUnactivable;

	private boolean canOpenDetails = true;

	public OneM2MApplication app;

	private static Context context;

	public MainAppEntryView(Context context, AttributeSet attrs) {
		super(context, attrs);

		MainAppEntryView.context = context;

		LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
		inflater.inflate(R.layout.main_app_entry_view, this, true);

		rlUnactivable = (RelativeLayout) findViewById(R.id.rl_main_app_entry_stopped);
		tvAppName = (TextView) findViewById(R.id.tv_main_app_entry_name);
		ivAppIcon = (ImageView) findViewById(R.id.iv_main_app_entry_icon);
	}

	public OneM2MApplication getApplication() {
		return app;
	}

	public void setData(final OneM2MApplication app, boolean canOpenDetails) {
		this.canOpenDetails = canOpenDetails;
		setData(app);
	}

	public void setData(final OneM2MApplication app) {
		this.app = app;

		if (tvAppName != null) {
			tvAppName.setText(this.app.getApn());
		}
		if (ivAppIcon != null) {
			// ivAppIcon.setImageDrawable(OTBIconManager.getInstance().getIconForApp(app.getRi(),
			// getResources()));
			new DownloadImageTask(ivAppIcon).execute(app.getIconUrl());
		}

		this.setClickable(true);

		if (canOpenDetails /* && app.isAccessible() */) {
			this.setOnLongClickListener(new OnLongClickListener() {
				@Override
				public boolean onLongClick(View arg0) {
					// Intent detailsActivity = new Intent(OTBMainAppEntryView.context,
					// OTBApplicationDetailsActivity.class);
					// detailsActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
					// detailsActivity.putExtra("applicationId", app.getId());
					// OTBMainAppEntryView.context.startActivity(detailsActivity);
					return true;
				}
			});
//			if (OTBConstants.ACTIVE.equals("Active"/* app.getStatus() */)) {
				this.setOnClickListener(new OnClickListener() {
					@Override
					public void onClick(View arg0) {
						Intent configActivity = new Intent(MainAppEntryView.context,
								ApplicationConfigActivity.class);
						configActivity.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
						configActivity.putExtra("applicationId", app.getRi());
						MainAppEntryView.context.startActivity(configActivity);
					}
				});
//			}
		}

		rlUnactivable.setVisibility(View.INVISIBLE);
	}

	private class DownloadImageTask extends AsyncTask<String, Void, Bitmap> {
		ImageView bmImage;

		public DownloadImageTask(ImageView bmImage) {
			this.bmImage = bmImage;
		}

		protected Bitmap doInBackground(String... urls) {
			Bitmap mIcon11 = null;
			String urldisplay = urls[0];
			if (urldisplay != null) {
				try {
					InputStream in = new java.net.URL(urldisplay).openStream();
					mIcon11 = BitmapFactory.decodeStream(in);
				} catch (Exception e) {
					Log.e("Error", e.getMessage());
					e.printStackTrace();
				}
			}
			
			return mIcon11;
		}

		protected void onPostExecute(Bitmap result) {
			if (result != null) {
				bmImage.setImageBitmap(result);	
			} else {
				bmImage.setImageDrawable(getResources().getDrawable(R.drawable.otb_appicon_default));
			}
			
			
			
		}
	}

}
