package org.loader.liteplayer;

import java.util.ArrayList;

import org.loader.liteplayer.application.App;
import org.loader.liteplayer.pojo.Music;
import org.loader.liteplayer.ui.CDView;
import org.loader.liteplayer.ui.LrcView;
import org.loader.liteplayer.ui.PagerIndicator;
import org.loader.liteplayer.ui.PlayBgShape;
import org.loader.liteplayer.utils.ImageTools;
import org.loader.liteplayer.utils.MusicIconLoader;
import org.loader.liteplayer.utils.MusicUtils;
import org.loader.liteplayer.utils.PlayPageTransformer;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.ShapeDrawable;
import android.os.Bundle;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.view.ViewGroup.MarginLayoutParams;
import android.view.Window;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.SeekBar;
import android.widget.TextView;

/**
 * liteplayer by loader
 * @author qibin
 */
public class PlayActivity extends BaseActivity implements OnClickListener {
	
	private LinearLayout mPlayContainer;
	private ImageView mPlayBackImageView; // back button
	private TextView mMusicTitle; // music title
	private ViewPager mViewPager; // cd or lrc
	private CDView mCdView; // cd
	private SeekBar mPlaySeekBar; // seekbar
	private ImageButton mStartPlayButton; // start or pause
	private TextView mSingerTextView; // singer
	private LrcView mLrcViewOnFirstPage; // single line lrc
	private LrcView mLrcViewOnSecondPage; // 7 lines lrc
	private PagerIndicator mPagerIndicator; // indicator
	
	// cd view and lrc view
	private ArrayList<View> mViewPagerContent = new ArrayList<View>(2);
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		requestWindowFeature(Window.FEATURE_NO_TITLE);
		setContentView(R.layout.play_activity_layout);
		setupViews();
//		allowBindService();
	}
	
	/**
	 * 初始化view
	 */
	private void setupViews() {
		mPlayContainer = (LinearLayout) findViewById(R.id.ll_play_container);
		mPlayBackImageView = (ImageView) findViewById(R.id.iv_play_back);
		mMusicTitle = (TextView) findViewById(R.id.tv_music_title);
		mViewPager = (ViewPager) findViewById(R.id.vp_play_container);
		mPlaySeekBar = (SeekBar) findViewById(R.id.sb_play_progress);
		mStartPlayButton = (ImageButton) findViewById(R.id.ib_play_start);
		mPagerIndicator = (PagerIndicator) findViewById(R.id.pi_play_indicator);
		
		// 动态设置seekbar的margin
		MarginLayoutParams p = (MarginLayoutParams) mPlaySeekBar.getLayoutParams();
		p.leftMargin = (int) (App.sScreenWidth * 0.1);
		p.rightMargin = (int) (App.sScreenWidth * 0.1);
		
		mPlaySeekBar.setOnSeekBarChangeListener(mSeekBarChangeListener);
		
		initViewPagerContent();
		mViewPager.setPageTransformer(true, new PlayPageTransformer());
		mPagerIndicator.create(mViewPagerContent.size());
		mViewPager.setOnPageChangeListener(mPageChangeListener);
		mViewPager.setAdapter(mPagerAdapter);
		
		mPlayBackImageView.setOnClickListener(this);
	}
	
	@Override
	protected void onResume() {
		super.onResume();
		allowBindService();
	}
	
	@Override
	protected void onPause() {
		allowUnbindService();
		super.onPause();
	}
	
	private OnPageChangeListener mPageChangeListener = new OnPageChangeListener() {
		@Override
		public void onPageSelected(int position) {
			if (position == 0) {
				if(mPlayService.isPlaying()) mCdView.start();
			} else {
				mCdView.pause();
			}
			
			mPagerIndicator.current(position);
		}
		
		@Override
		public void onPageScrolled(int arg0, float arg1, int arg2) {
			
		}
		
		@Override
		public void onPageScrollStateChanged(int arg0) {
			
		}
	};
	
	/**
	 * 拖动进度条
	 */
	private SeekBar.OnSeekBarChangeListener mSeekBarChangeListener = 
			new SeekBar.OnSeekBarChangeListener() {
		@Override
		public void onProgressChanged(SeekBar seekBar, int progress,
				boolean fromUser) {
			
		}

		@Override
		public void onStartTrackingTouch(SeekBar seekBar) {
			
		}

		@Override
		public void onStopTrackingTouch(SeekBar seekBar) {
			int progress = seekBar.getProgress();
			mPlayService.seek(progress);
			mLrcViewOnFirstPage.onDrag(progress);
			mLrcViewOnSecondPage.onDrag(progress);
		}
	};
	
	private PagerAdapter mPagerAdapter = new PagerAdapter() {
		@Override
		public int getCount() {
			return mViewPagerContent.size();
		}

		@Override
		public boolean isViewFromObject(View view, Object obj) {
			return view == obj;
		}
		
		@Override
		public Object instantiateItem(ViewGroup container, int position) {
			container.addView(mViewPagerContent.get(position));
			return mViewPagerContent.get(position);
		}
		
		@Override
		public void destroyItem(ViewGroup container, int position, Object object) {
			((ViewPager) container).removeView((View) object);
		}
	};
	
	/**
	 * 初始化viewpager的内容
	 */
	private void initViewPagerContent() {
		View cd = View.inflate(this, R.layout.play_pager_item_1, null);
		mCdView = (CDView) cd.findViewById(R.id.play_cdview);
		mSingerTextView = (TextView) cd.findViewById(R.id.play_singer);
		mLrcViewOnFirstPage = (LrcView) cd.findViewById(R.id.play_first_lrc);
		
		View lrcView = View.inflate(this, R.layout.play_pager_item_2, null);
		mLrcViewOnSecondPage = (LrcView) lrcView.findViewById(R.id.play_first_lrc_2);
		
		mViewPagerContent.add(cd);
		mViewPagerContent.add(lrcView);
	}
	
	
	private void setBackground(int position) {
		Music currentMusic = MusicUtils.sMusicList.get(position);
		Bitmap bgBitmap = MusicIconLoader.getInstance().load(currentMusic.getImage());
		if(bgBitmap == null) {
			bgBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
		}
		
//		Palette.generateAsync(bgBitmap, new PaletteAsyncListener() {
//			@Override
//			public void onGenerated(Palette palette) {
//				Palette.Swatch swatch = palette.getVibrantSwatch();
//				if(swatch == null) return;
//				
//				L.l("textColor", swatch.getBodyTextColor());
//				L.l("titleColor", swatch.getTitleTextColor());
//				mMusicTitle.setTextColor(swatch.getBodyTextColor());
//				mPlayContainer.setBackgroundDrawable(new ShapeDrawable(new PlayBgShape(bgBitmap)));
//			}
//		});
		mPlayContainer.setBackgroundDrawable(new ShapeDrawable(new PlayBgShape(bgBitmap)));
	}
	
	
	/**
	 * 上一曲
	 * @param view
	 */
	public void pre(View view) {
		mPlayService.pre(); // 上一曲
	}
	
	/**
	 * 播放 or 暂停
	 * @param view
	 */
	public void play(View view) {
		if(mPlayService.isPlaying()) {
			mPlayService.pause(); // 暂停
			mCdView.pause();
			mStartPlayButton.setImageResource(R.drawable.player_btn_play_normal);
		}else {
			onPlay(mPlayService.resume()); // 播放	
		}
	}
	
	/**
	 * 上一曲
	 * @param view
	 */
	public void next(View view) {
		mPlayService.next(); // 上一曲
	}
	
	/**
	 * 播放时调用 主要设置显示当前播放音乐的信息
	 * @param position
	 */
	private void onPlay(int position) {
		Music music = MusicUtils.sMusicList.get(position);
		
		mMusicTitle.setText(music.getTitle());
		mSingerTextView.setText(music.getArtist());
		mPlaySeekBar.setMax(music.getLength());
		Bitmap bmp = MusicIconLoader.getInstance().load(music.getImage());
		if(bmp == null) bmp = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher);
		mCdView.setImage(ImageTools.scaleBitmap(bmp, (int)(App.sScreenWidth * 0.7)));
		
		if(mPlayService.isPlaying()) {
			mCdView.start();
			mStartPlayButton.setImageResource(R.drawable.player_btn_pause_normal);
		}else {
			mCdView.pause();
			mStartPlayButton.setImageResource(R.drawable.player_btn_play_normal);
		}
	}
	
	private void setLrc(int position) {
		Music music = MusicUtils.sMusicList.get(position);
		String lrcPath = MusicUtils.getLrcDir() + music.getTitle() + ".lrc";
		mLrcViewOnFirstPage.setLrcPath(lrcPath);
		mLrcViewOnSecondPage.setLrcPath(lrcPath);
	}

	@Override
	public void onPublish(int progress) {
		mPlaySeekBar.setProgress(progress);
		if(mLrcViewOnFirstPage.hasLrc()) mLrcViewOnFirstPage.setProgress(progress);
		if(mLrcViewOnSecondPage.hasLrc()) mLrcViewOnSecondPage.setProgress(progress);
	}

	@Override
	public void onChange(int position) {
		setBackground(position);
		onPlay(position);
		setLrc(position);
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.iv_play_back:
			finish();
			break;
		default:
			break;
		}
	}
	
	@Override
	protected void onDestroy() {
//		allowUnbindService();
		super.onDestroy();
	}
}