package org.auie.ui;

import org.auie.utils.UEMethod;

import android.annotation.SuppressLint;
import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.Color;
import android.graphics.Typeface;
import android.support.v4.view.ViewPager.OnPageChangeListener;
import android.text.TextUtils;
import android.util.AttributeSet;
import android.view.Gravity;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;

public class UIViewSwitcher extends LinearLayout {

	private LinearLayout.LayoutParams expandedTabLayoutParams;

	public OnPageChangeListener delegatePageListener;

	private LinearLayout tabsContainer;
	private UIViewPager pager;

	private int tabCount;
	private int selectedPosition = 0;

	private boolean autoNotice = true;
	private boolean autoAnimate = false;
	
	private int tabPadding = 24;
	private int tabTextSize = 12;
	private int tabImageWidth = 32;
	private int tabImageHeight = 32;
	
	private int tabTextColor = 0xDD666666;
	private int tabTextSelectedColor = 0xFF45C01A;
	private int tabBackgroundColor = 0xFFF8F8F8;
	private int tabBackgroundSelectColor = Color.TRANSPARENT;
	private int toplineColor = 0x33D8D8D8;
	
	private Typeface tabTypeface = null;
	private int tabTypefaceStyle = Typeface.NORMAL;

	public interface SwitchProvider {
		public Drawable getIconDrawable(int position);
		public Drawable getIconSelectedDrawable(int position);
	}
	
	public UIViewSwitcher(Context context) {
		super(context);
		createView();
	}

	public UIViewSwitcher(Context context, AttributeSet attrs) {
		super(context, attrs);
		createView();
	}

	@SuppressLint("NewApi")
	public UIViewSwitcher(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		createView();
	}
	
	private void createView(){

		setBackgroundColor(Color.LTGRAY);
		
		LinearLayout rootLayout = new LinearLayout(getContext());
		rootLayout.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		rootLayout.setOrientation(LinearLayout.VERTICAL);
		
		View view = new View(getContext());
		view.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, UEMethod.dp2px(getContext(), 0.5f)));
		view.setBackgroundColor(toplineColor);
		
		tabsContainer = new LinearLayout(getContext());
		tabsContainer.setOrientation(LinearLayout.HORIZONTAL);
		tabsContainer.setBackgroundColor(tabBackgroundColor);
		tabsContainer.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
		
		rootLayout.addView(view);
		rootLayout.addView(tabsContainer);
		addView(rootLayout);
		
		expandedTabLayoutParams = new LinearLayout.LayoutParams(0, LayoutParams.MATCH_PARENT, 1.0f);
	}

	public void setViewPager(UIViewPager pager) {
		this.pager = pager;
		this.pager.setEnableScroll(false);

		if (pager.getAdapter() == null) {
			throw new IllegalStateException("ViewPager does not have adapter instance.");
		}
		
		notifyDataSetChanged();
	}

	public void setOnPageChangeListener(OnPageChangeListener listener) {
		this.delegatePageListener = listener;
	}

	public void setSelectedPosition(int selectedPosition) {
		this.selectedPosition = selectedPosition;
	}

	public void notifyDataSetChanged() {

		tabsContainer.removeAllViews();

		tabCount = pager.getAdapter().getCount();

		for (int i = 0; i < tabCount; i++) {
			addTab(i, pager.getAdapter().getPageTitle(i).toString(), ((SwitchProvider) pager.getAdapter()).getIconDrawable(i));
		}

		updateTabStyles();

	}


	private void addTab(final int position, String title, Drawable drawable) {
		
		LinearLayout tab = new LinearLayout(getContext());
		tab.setLayoutParams(new LayoutParams(LayoutParams.MATCH_PARENT, UEMethod.dp2px(getContext(), 52)));
		tab.setGravity(Gravity.CENTER);
		tab.setOrientation(LinearLayout.HORIZONTAL);
		
		RelativeLayout tabContent = new RelativeLayout(getContext());
		tabContent.setLayoutParams(new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.MATCH_PARENT, RelativeLayout.LayoutParams.WRAP_CONTENT));
		
		RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(UEMethod.dp2px(getContext(), tabImageWidth), UEMethod.dp2px(getContext(), tabImageHeight));
		params.setMargins(0, UEMethod.dp2px(getContext(), 4), 0, 0);
		params.addRule(RelativeLayout.CENTER_HORIZONTAL);
		ImageView imageView = new ImageView(getContext());
		imageView.setImageDrawable(drawable);
		imageView.setLayoutParams(params);
		imageView.setId(1);
		imageView.setScaleType(ScaleType.FIT_CENTER);
		
		RelativeLayout.LayoutParams params2 = new RelativeLayout.LayoutParams(RelativeLayout.LayoutParams.WRAP_CONTENT, RelativeLayout.LayoutParams.WRAP_CONTENT);
		params2.addRule(RelativeLayout.BELOW, 1);
		params2.addRule(RelativeLayout.CENTER_HORIZONTAL);
		params2.setMargins(0, 0, 0, 6);
		TextView textView = new TextView(getContext());
		textView.setLayoutParams(params2);
		textView.setText(title);
		textView.setTextSize(tabTextSize);
		textView.setTextColor(tabTextColor);
		textView.setSingleLine();
		if (TextUtils.isEmpty(title)) {
			textView.setVisibility(View.GONE);
		}
		
		RelativeLayout.LayoutParams params3 = new RelativeLayout.LayoutParams(UEMethod.dp2px(getContext(), 10), UEMethod.dp2px(getContext(), 10));
		params3.addRule(RelativeLayout.RIGHT_OF, 1);
		params3.setMargins(0, UEMethod.dp2px(getContext(), 6), 0, 0);
		ImageView noticeImageView = new ImageView(getContext());
		noticeImageView.setLayoutParams(params3);
		noticeImageView.setScaleType(ScaleType.FIT_CENTER);
		
		tabContent.addView(imageView);
		tabContent.addView(textView);
		tabContent.addView(noticeImageView);
		tab.addView(tabContent);
		
		tab.setFocusable(true);
		tab.setOnClickListener(new OnClickListener() {
			@Override
			public void onClick(View v) {
				pager.setEnableScroll(true);
				pager.setCurrentItem(position, autoAnimate);
				pager.setEnableScroll(false);
				selectedPosition = position;
				updateTabStyles();
				if (delegatePageListener != null) {
					delegatePageListener.onPageSelected(position);
				}
			}
		});
		
		tab.setPadding(tabPadding, 0, tabPadding, 0);
		tabsContainer.addView(tab, position, expandedTabLayoutParams);
	}
	
	public void addNotice(int position, Drawable drawable){
		View v = tabsContainer.getChildAt(position);
		if (v instanceof LinearLayout) {
			View parentView = ((ViewGroup) v).getChildAt(0);
			View noticeView = ((ViewGroup) parentView).getChildAt(2);
			if (noticeView instanceof ImageView) {
				((ImageView) noticeView).setImageDrawable(drawable);
			}
		}
	}
	
	public void removeNotice(int position){
		View v = tabsContainer.getChildAt(position);
		if (v instanceof LinearLayout) {
			View parentView = ((ViewGroup) v).getChildAt(0);
			View noticeView = ((ViewGroup) parentView).getChildAt(2);
			if (noticeView instanceof ImageView) {
				((ImageView) noticeView).setImageDrawable(null);
			}
		}
	}
	
	private void updateTabStyles() {

		for (int i = 0; i < tabCount; i++) {

			View v = tabsContainer.getChildAt(i);
			
			if (i == selectedPosition) {
				v.setBackgroundColor(tabBackgroundSelectColor);
			}else{
				v.setBackgroundColor(Color.TRANSPARENT);
			}
			
			if (v instanceof LinearLayout) {
				View parentView = ((ViewGroup) v).getChildAt(0);
				View childView = ((ViewGroup) parentView).getChildAt(0);
				
				if (childView instanceof ImageView) {
					ImageView imageView = (ImageView) childView;
					
					SwitchProvider provider = (SwitchProvider) pager.getAdapter();
					
					if (i == selectedPosition) {
						imageView.setImageDrawable(provider.getIconSelectedDrawable(i));
					}else{
						imageView.setImageDrawable(provider.getIconDrawable(i));
					}
				}
				
				childView = ((ViewGroup) parentView).getChildAt(1);
				
				if (childView instanceof TextView) {

					TextView textView = (TextView) childView;
					textView.setTypeface(tabTypeface, tabTypefaceStyle);
					textView.setTextColor(tabTextColor);
					textView.setText(textView.getText().toString());
					
					if (i == selectedPosition) {
						textView.setTextColor(tabTextSelectedColor);
					}else{
						textView.setTextColor(tabTextColor);
					}
				}
				
				childView = ((ViewGroup) parentView).getChildAt(2);
				if (childView instanceof ImageView) {
					if (autoNotice && i == selectedPosition) {
						((ImageView) childView).setImageDrawable(null);
					}
				}
			}
		}

	}

	public OnPageChangeListener getDelegatePageListener() {
		return delegatePageListener;
	}

	public void setDelegatePageListener(OnPageChangeListener delegatePageListener) {
		this.delegatePageListener = delegatePageListener;
	}

	public int getTabTextSize() {
		return tabTextSize;
	}

	public void setTabTextSize(int tabTextSize) {
		this.tabTextSize = tabTextSize;
	}

	public boolean isAutoNotice() {
		return autoNotice;
	}

	public void setAutoNotice(boolean autoNotice) {
		this.autoNotice = autoNotice;
	}
	
	public void setAutoAnimate(boolean autoAnimate) {
		this.autoAnimate = autoAnimate;
	}

	public int getTabTextColor() {
		return tabTextColor;
	}

	public void setTabTextColor(int tabTextColor) {
		this.tabTextColor = tabTextColor;
	}

	public int getTabTextSelectedColor() {
		return tabTextSelectedColor;
	}

	public void setTabTextSelectedColor(int tabTextSelectedColor) {
		this.tabTextSelectedColor = tabTextSelectedColor;
	}

	public int getTabBackgroundColor() {
		return tabBackgroundColor;
	}

	public void setTabBackgroundColor(int tabBackgroundColor) {
		this.tabBackgroundColor = tabBackgroundColor;
		tabsContainer.setBackgroundColor(tabBackgroundColor);
	}

	public int getTabBackgroundSelectColor() {
		return tabBackgroundSelectColor;
	}

	public void setTabBackgroundSelectColor(int tabBackgroundSelectColor) {
		this.tabBackgroundSelectColor = tabBackgroundSelectColor;
	}

	public int getToplineColor() {
		return toplineColor;
	}

	public void setToplineColor(int toplineColor) {
		this.toplineColor = toplineColor;
	}

	public Typeface getTabTypeface() {
		return tabTypeface;
	}

	public void setTabTypeface(Typeface tabTypeface) {
		this.tabTypeface = tabTypeface;
	}

	public int getTabTypefaceStyle() {
		return tabTypefaceStyle;
	}

	public void setTabTypefaceStyle(int tabTypefaceStyle) {
		this.tabTypefaceStyle = tabTypefaceStyle;
	}

	public UIViewPager getPager() {
		return pager;
	}

	public int getSelectedPosition() {
		return selectedPosition;
	}
	
	public void setTabImageSize(int tabImageSize) {
		this.tabImageWidth = tabImageSize;
		this.tabImageHeight = tabImageSize;
	}
	
	public void setTabImageSize(int tabImageWidth, int tabImageHeight) {
		this.tabImageWidth = tabImageWidth;
		this.tabImageHeight = tabImageHeight;
	}

	public int getTabImageWidth() {
		return tabImageWidth;
	}

	public void setTabImageWidth(int tabImageWidth) {
		this.tabImageWidth = tabImageWidth;
	}

	public int getTabImageHeight() {
		return tabImageHeight;
	}

	public void setTabImageHeight(int tabImageHeight) {
		this.tabImageHeight = tabImageHeight;
	}
	
}