package org.loader.liteplayer;

import java.util.ArrayList;

import org.loader.liteplayer.fragment.LocalFragment;
import org.loader.liteplayer.fragment.NetSearchFragment;
import org.loader.liteplayer.service.DownloadService;
import org.loader.liteplayer.service.PlayService;
import org.loader.liteplayer.ui.Indicator;
import org.loader.liteplayer.ui.ScrollRelativeLayout;
import org.loader.liteplayer.utils.MusicUtils;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.app.FragmentPagerAdapter;
import android.support.v4.view.ViewPager;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.view.Gravity;
import android.view.KeyEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.animation.AnimationUtils;
import android.widget.LinearLayout;
import android.widget.PopupWindow;
import android.widget.PopupWindow.OnDismissListener;
import android.widget.TextView;

/**
 * liteplayer by loader
 * @author qibin
 */
public class MainActivity extends BaseActivity implements OnClickListener {

	private ScrollRelativeLayout mMainContainer;
	private Indicator mIndicator;
	
	private TextView mLocalTextView;
	private TextView mSearchTextView;
	private ViewPager mViewPager;
	private View mPopShownView;
	
	private PopupWindow mPopupWindow;
	
	private ArrayList<Fragment> mFragments = new ArrayList<Fragment>();

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		registerReceiver();
		initFragments();
		setupViews();
//		L.l(App.sMusicList.get(0).getTitle());
	}
	
	private void registerReceiver() {
		IntentFilter filter = new IntentFilter( Intent.ACTION_MEDIA_SCANNER_STARTED);
		filter.addAction(Intent.ACTION_MEDIA_SCANNER_FINISHED);
		filter.addDataScheme("file");
		registerReceiver(mScanSDCardReceiver, filter);
	}
	
	private void setupViews() {
		mMainContainer = (ScrollRelativeLayout) findViewById(R.id.rl_main_container);
		mIndicator = (Indicator) findViewById(R.id.main_indicator);
		mLocalTextView = (TextView) findViewById(R.id.tv_main_local);
		mSearchTextView = (TextView) findViewById(R.id.tv_main_remote);
		mViewPager = (ViewPager) findViewById(R.id.vp_main_container);
		mPopShownView = findViewById(R.id.view_pop_show);
		
		mViewPager.setAdapter(mPagerAdapter);
		mViewPager.setOnPageChangeListener(mPageChangeListener);
		
		mLocalTextView.setOnClickListener(this);
		mSearchTextView.setOnClickListener(this);
		
		selectTab(0);
	}
	
	private OnPageChangeListener mPageChangeListener = new OnPageChangeListener() {
		@Override
		public void onPageSelected(int position) {
			selectTab(position);
			mMainContainer.showIndicator();
		}
		
		@Override
		public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
			mIndicator.scroll(position, positionOffset);
		}
		
		@Override
		public void onPageScrollStateChanged(int position) {
			
		}
	};
	
	private FragmentPagerAdapter mPagerAdapter = 
			new FragmentPagerAdapter(getSupportFragmentManager()) {
		@Override
		public int getCount() {
			return mFragments.size();
		}
		
		@Override
		public Fragment getItem(int position) {
			return mFragments.get(position);
		}
	};
	
	/**
	 * 切换导航indicator
	 * @param index
	 */
	private void selectTab(int index) {
		switch (index) {
		case 0:
			mLocalTextView.setTextColor(getResources().getColor(R.color.main));
			mSearchTextView.setTextColor(getResources().getColor(R.color.main_dark));
			break;
		case 1:
			mLocalTextView.setTextColor(getResources().getColor(R.color.main_dark));
			mSearchTextView.setTextColor(getResources().getColor(R.color.main));
			break;
		}
	}
	
	private void initFragments() {
		LocalFragment localFragment = new LocalFragment();
		NetSearchFragment netSearchFragment = new NetSearchFragment();
		
		mFragments.add(localFragment);
		mFragments.add(netSearchFragment);
	}
	
	/**
	 * 获取音乐播放服务
	 * @return
	 */
	public PlayService getPlayService() {
		return mPlayService;
	}
	
	public void hideIndicator() {
		mMainContainer.hideIndicator();
	}
	
	public void showIndicator() {
		mMainContainer.showIndicator();
	}
	
	public void onPopupWindowShown() {
		mPopShownView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.layer_show_anim));
		mPopShownView.setVisibility(View.VISIBLE);
	}
	
	public void onPopupWindowDismiss() {
		mPopShownView.startAnimation(AnimationUtils.loadAnimation(this, R.anim.layer_gone_anim));
		mPopShownView.setVisibility(View.GONE);
	}
	
	@Override
	public void onPublish(int progress) {
		// 如果当前显示的fragment是音乐列表fragment
		// 则调用fragment的setProgress设置进度
		if(mViewPager.getCurrentItem() == 0) {
			((LocalFragment)mFragments.get(0)).setProgress(progress);
		}
	}

	@Override
	public void onChange(int position) {
		// 如果当前显示的fragment是音乐列表fragment
		// 则调用fragment的setProgress切换歌曲
		if(mViewPager.getCurrentItem() == 0) {
			((LocalFragment)mFragments.get(0)).onPlay(position);
		}
	}
	
	private void onShowMenu() {
		onPopupWindowShown();
		if(mPopupWindow == null) {
			View view = View.inflate(this, R.layout.exit_pop_layout, null);
			View shutdown = view.findViewById(R.id.tv_pop_shutdown);
			View exit = view.findViewById(R.id.tv_pop_exit);
			View cancel = view.findViewById(R.id.tv_pop_cancel);
			
			// 不需要共享变量, 所以放这没事
			shutdown.setOnClickListener(this);
			exit.setOnClickListener(this);
			cancel.setOnClickListener(this);
			
			mPopupWindow = new PopupWindow(view,
					LinearLayout.LayoutParams.MATCH_PARENT,
					LinearLayout.LayoutParams.WRAP_CONTENT, true);
			mPopupWindow.setBackgroundDrawable(new ColorDrawable(Color.TRANSPARENT));
			mPopupWindow.setAnimationStyle(R.style.popwin_anim);
			mPopupWindow.setFocusable(true);
			mPopupWindow.setOnDismissListener(new OnDismissListener() {
				@Override
				public void onDismiss() {
					onPopupWindowDismiss();
				}
			});
		}
		
		mPopupWindow.showAtLocation(getWindow().getDecorView(), 
				Gravity.BOTTOM|Gravity.CENTER_HORIZONTAL, 0, 0);
	}
	
	@Override
	public void onClick(View v) {
		switch (v.getId()) {
		case R.id.tv_main_local:
			mViewPager.setCurrentItem(0);
			break;
		case R.id.tv_main_remote:
			mViewPager.setCurrentItem(1);
			break;
		case R.id.tv_pop_exit:
			stopService(new Intent(this, PlayService.class));
			stopService(new Intent(this, DownloadService.class));
		case R.id.tv_pop_shutdown:
			finish();
		case R.id.tv_pop_cancel:
			if(mPopupWindow != null && mPopupWindow.isShowing()) mPopupWindow.dismiss();
			onPopupWindowDismiss();
	 		break;
		}
	}
	
	@Override
	public boolean onKeyDown(int keyCode, KeyEvent event) {
		if(keyCode == KeyEvent.KEYCODE_MENU) {
			if(mPopupWindow != null && mPopupWindow.isShowing()) {
				mPopupWindow.dismiss();
				return true;
			}
			
			onShowMenu();
			return true;
		}
		
		return super.onKeyDown(keyCode, event);
	}
	
	@Override
	protected void onDestroy() {
		unregisterReceiver(mScanSDCardReceiver);
		super.onDestroy();
	}
	
	private BroadcastReceiver mScanSDCardReceiver = new BroadcastReceiver() {
		public void onReceive(Context context, Intent intent) {
			if(intent.getAction().equals(Intent.ACTION_MEDIA_SCANNER_FINISHED)) {
				MusicUtils.initMusicList();
				((LocalFragment)mFragments.get(0)).onMusicListChanged();
			}
		}
	};
}