package com.sharefaith.thesharefaithapp.adapters;

import android.app.ActivityManager;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.AsyncTask;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import com.sharefaith.thesharefaithapp.R;
import com.sharefaith.thesharefaithapp.base.SFAppData;
import com.sharefaith.thesharefaithapp.base.SFApplication;
import com.sharefaith.thesharefaithapp.base.SFConfig;
import com.sharefaith.thesharefaithapp.base.SFUtil;
import com.sharefaith.thesharefaithapp.models.SFSermonSeriesModel;

import java.io.File;

/**
 * The adapter feeding the images, sermons-series-listing
 * Created by Chris Ostmo on 2014-11-02.
 */
public class SFSermonAdapter extends BaseAdapter
{
	private BitmapFactory.Options mOptions;
	private SFSermonSeriesModel[] mItems;
	private SFApplication mApplication = SFApplication.getInstance();
	public SFConfig mConfig;
	private SFAppData mAppData;
	private static LimitedMapCache<String, Bitmap> mBitMapCache;

	/**
	 * Constructor
	 * @param context
	 * @param items
	 */
	public SFSermonAdapter( Context context, SFSermonSeriesModel[] items )
	{

		this.mItems = items;
		this.mConfig = new SFConfig();
		this.mAppData = new SFAppData();
		this.mOptions = SFUtil.commonImgOpt();

		int memMB = ((ActivityManager)context.getSystemService( Context.ACTIVITY_SERVICE )).getMemoryClass();
		this.mBitMapCache = new LimitedMapCache<String,Bitmap> ( memMB/2 );
	}

	private static class ViewHolder
	{
		public ImageView imageView;
		public TextView dateView;
		public File imageFile;
		public TextView titleView;
		public TextView contentView;
		public int position;
	}

	/**
	 *
	 * @param position
	 * @param convertView
	 * @param parent
	 * @return
	 */
	@Override
	public View getView( int position, View convertView, ViewGroup parent )
	{
		ViewHolder holder;
		View v = convertView;

		if( v == null )
		{
			LayoutInflater vi = LayoutInflater.from( mApplication );
			int layout = mAppData.getLayout( mApplication.currentPlaylistPosition );
			v = getLayout( vi, layout );
			//Hold references:
			holder = new ViewHolder();
			holder.imageView = (ImageView) v.findViewById( R.id.imageView );
			holder.dateView = (TextView) v.findViewById( R.id.date_textView );
			holder.titleView = (TextView) v.findViewById( R.id.title_textView );
			holder.contentView = (TextView) v.findViewById( R.id.content_textView );
			v.setTag( holder );
		}
		else
		{
			holder = (ViewHolder) convertView.getTag();
		}

		SFSermonSeriesModel currentObject = this.mItems[position];
		holder.position = position;

		if( currentObject != null )
		{

			File imgFile = new File( this.mConfig.mCustomAssetPath + currentObject.mThumbnail );
			if( currentObject.mThumbnail.length() > 0 &&  imgFile.exists() )
			{
				//The view has different img.
				holder.imageFile = imgFile;
				String fileStr = imgFile.getAbsolutePath();

				Bitmap bitmap = this.mBitMapCache.get(fileStr);
				if (null == bitmap)
				{
					try {
						bitmap = BitmapFactory.decodeFile(fileStr, this.mOptions);
						this.mBitMapCache.add(fileStr, bitmap);
					}
					catch (OutOfMemoryError e)
					{
						//((SFMainActivity)this.mContext).clearCaches();
						System.gc();
						bitmap = BitmapFactory.decodeFile(fileStr, this.mOptions);
					}
				}
				holder.imageView.setImageBitmap(bitmap);
				holder.dateView.setVisibility( View.GONE );
			}
			else
			{
				holder.imageView.setImageBitmap( null );
			}

			if( holder.contentView != null )
			{
				//holder.contentView.setTypeface( SFTypeFaceSpan.getAssetTypeface( mContext.getResources().getString( R.string.font_regular ) ) );
				//holder.contentView.setTextSize( mContext.getResources().getDimension( R.dimen.post_excerpt_font_size ) );
				if( currentObject.mDescription !="" )
				{
					holder.contentView.setText( currentObject.mDescription );
				}
				else
				{
					holder.contentView.setText( currentObject.mPreacher );
				}
			}

			if( holder.titleView != null && mAppData.getIsTitleEnabled( mApplication.currentPlaylistPosition ))
			{
				//holder.titleView.setTypeface( SFTypeFaceSpan.getAssetTypeface( mContext.getResources().getString( R.string.font_regular ) ) );
				//holder.titleView.setTextSize( mContext.getResources().getDimension( R.dimen.sermon_title_list_font_size ) );
				String showTitle = SFUtil.stripHtml( currentObject.mShowSeriesTitle ).toString();
				holder.titleView.setText( showTitle );
				holder.titleView.setVisibility( View.VISIBLE );
			}
			else
			{
				//if image is missing show title
				if( holder.titleView != null && currentObject.mThumbnail.length() < 1)
				{
					String showTitle = SFUtil.stripHtml( currentObject.mShowSeriesTitle ).toString();
					holder.titleView.setText( showTitle );
					holder.titleView.setVisibility( View.VISIBLE );
				}
				else
				{
					holder.titleView.setVisibility( View.GONE );
				}
			}
		}

		return v;
	}

	/**
	 * @deprecated
	 */
	private class LoadImage extends AsyncTask<Void,Void,String>
	{
		private int mPosition;
		private ViewHolder mHolder;
		private Bitmap mBitmap;
		private String mFile;

		public LoadImage( int position, ViewHolder holder, String file )
		{
			mPosition = position;
			mHolder = holder;
			mFile = file;
		}

		@Override
		protected String doInBackground( Void... params )
		{
			mBitmap = BitmapFactory.decodeFile( mFile, SFUtil.commonImgOpt() );
			return null;
		}

		@Override
		protected void onPostExecute( String results )
		{
			if (mHolder.position == mPosition)
			{
				mHolder.imageView.setImageBitmap( mBitmap );
			}
		}
	}

	/**
	 *  Actions to get number of items in arraylist
	 *
	 * @since		20120106
	 */

	@Override
	public int getCount()
	{
		return this.mItems.length;
	}

	/**
	 *  Actions to get position of item
	 *
	 * @since		20120106
	 */

	@Override
	public Object getItem( int position )
	{
		return null;
	}

	/**
	 *  Actions to get item ID
	 *
	 * @since		20120106
	 */

	@Override
	public long getItemId( int id )
	{
		return 0;
	}

	/**
	 * clear the Bitmap cache
	 */
	public void clearCache()
	{
		this.mBitMapCache.clear();
	}

	/**
	 * get the layout of the section
	 * @param vi
	 * @param layout
	 * @return
	 */
	private View getLayout( LayoutInflater vi, int layout)
	{
		View view = null;

		if( layout == 0 )
		{
			view = vi.inflate( R.layout.sf_gamut_item, null );
		}

		else if( layout == 1 )
		{
			view = vi.inflate( R.layout.sf_nook_item, null );
		}

		else if( layout == 2 )
		{
			view = vi.inflate( R.layout.sf_reveal_item, null );
		}

		return view;
	}
}
