package com.gc.phonetutorial.activities;


import com.gc.phonetutorial.R;
import com.gc.phonetutorial.utils.Utils;
import com.gc.phonetutorial.views.ButtonFloat;
import com.nineoldandroids.animation.ObjectAnimator;
import com.nineoldandroids.view.ViewHelper;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Color;
import android.graphics.drawable.BitmapDrawable;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.os.Bundle;
import android.view.Gravity;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.View.OnTouchListener;
import android.view.Window;
import android.widget.ImageView;
import android.widget.ImageView.ScaleType;
import android.widget.FrameLayout;
import android.widget.LinearLayout;
import android.widget.RelativeLayout;
import android.widget.TextView;


public class TutorialActivity extends Activity implements OnTouchListener, OnClickListener{
	
	int width = 0;
	int widthTitle = 0;
	int height = 0;
	
	int[] images;
	String[] titles;
	
	LinearLayout imageContainer;
	LinearLayout titleContainer;
	
	int position = 0;
	LinearLayout positionIndicator;
	
	int colorIndicator = Color.parseColor("#FFFFFF");
	int colorBackground = Color.parseColor("#1E88E5");
	int colorButton = Color.parseColor("#00C853");
	int colorIcon = Color.parseColor("#FFFFFF");
	
	
	public final static String TITLES = "TITLES";
	public final static String IMAGES = "IMAGES";
	public final static String COLORINDICATOR = "COLORINDICATOR";
	public final static String COLORBACKGROUND = "COLORBACKGROUND";
	public final static String COLORBUTTON = "COLORBUTTON";
	public final static String ICON = "ICON";
	public final static String COLORICON = "COLORICON";
	
	
	ButtonFloat nextButton;
	

	@Override
    protected void onCreate(Bundle savedInstanceState) {
    	requestWindowFeature(Window.FEATURE_NO_TITLE);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_tutorial);
        
        this.images = getIntent().getIntArrayExtra(IMAGES);
        
        this.titles = getIntent().getStringArrayExtra(TITLES);
        
        if(getIntent().hasExtra(COLORBACKGROUND)){
        	colorBackground = getIntent().getIntExtra(COLORBACKGROUND, Color.parseColor("#1E88E5"));
        }
        
        if(getIntent().hasExtra(COLORINDICATOR)){
        	colorIndicator = getIntent().getIntExtra(COLORINDICATOR, Color.parseColor("#FFFFFF"));
        }
        
        if(getIntent().hasExtra(COLORBUTTON)){
        	colorButton = getIntent().getIntExtra(COLORBUTTON, Color.parseColor("#00C853"));
        }
        
        positionIndicator = (LinearLayout) findViewById(R.id.positionIndicator);
        
        imageContainer = (LinearLayout) findViewById(R.id.image_container);
        titleContainer = (LinearLayout) findViewById(R.id.title_container);
        View content = findViewById(R.id.content);
        content.setOnTouchListener(this);
        content.setBackgroundColor(colorBackground);
        
        final View originContent = findViewById(R.id.origin_content);
        originContent.post(new Runnable() {
			
			@Override
			public void run() {
				
				width = originContent.getWidth();
				height = originContent.getHeight();
				
				// Colocate frame in to the phone
				View frame = findViewById(R.id.frame);
				RelativeLayout.LayoutParams params = (RelativeLayout.LayoutParams) frame.getLayoutParams();
				params.height = height;
				params.width = width;
				ViewHelper.setX(frame,Utils.getRelativeLeft(originContent));
				ViewHelper.setY(frame,Utils.getRelativeTop(originContent));
				
				//Add images to frame
				addImages();
				
				addTitles();
				
				addPositionIndicators();
				setBigBackground(positionIndicator.getChildAt(0));
			}
		});
        
        // Next Button
        nextButton = (ButtonFloat) findViewById(R.id.buttonNext);
        nextButton.setBackgroundColor(colorButton);
        nextButton.setOnClickListener(this);
        if(getIntent().hasExtra(ICON)){
        	int iconResource = getIntent().getIntExtra(ICON, 1);
        	Drawable drawable = getResources().getDrawable(iconResource);
        	nextButton.setIcon(drawable);
        }else{
        	if(getIntent().hasExtra(COLORICON))
        		colorIcon = getIntent().getIntExtra(COLORICON, 1);
        	Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_next);
        	Bitmap bitmapMutable = bitmap.copy(Config.ARGB_8888, true);
        	bitmapMutable = Utils.changeColorIcon(bitmapMutable, colorIcon);
        	Drawable drawable = new BitmapDrawable(getResources(),bitmapMutable);
        	nextButton.setIcon(drawable);
        }
        
    }
	
	/**
	 * Click in next button
	 */
	@Override
	public void onClick(View v) {
		Intent data = new Intent();
		setResult(RESULT_OK, data);
		finish();
	}
	
	
	private void addImages(){
		for(int resource : images){
			ImageView image = new ImageView(TutorialActivity.this);
			image.setAdjustViewBounds(true);
			image.setScaleType(ScaleType.CENTER_CROP);
			image.setImageResource(resource);
			imageContainer.addView(image);
			LinearLayout.LayoutParams params2 = (LinearLayout.LayoutParams) image.getLayoutParams();
			params2.width = width;
			params2.height = height;
		}
		FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) imageContainer.getLayoutParams();
		params.width = width * images.length;
	}
	
	private void addTitles(){
		widthTitle = titleContainer.getWidth();
		for(String title : titles){
			TextView textView = new TextView(TutorialActivity.this);
			titleContainer.addView(textView);
			LinearLayout.LayoutParams params2 = (LinearLayout.LayoutParams) textView.getLayoutParams();
			params2.width = widthTitle;
			params2.height = titleContainer.getHeight();
			textView.setGravity(Gravity.CENTER);
			textView.setTextColor(colorIndicator);
			textView.setText(title);
			textView.setPadding(Utils.dpToPx(16, getResources()), 0, Utils.dpToPx(16, getResources()), 0);
		}
		FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) titleContainer.getLayoutParams();
		params.width = titleContainer.getWidth() * images.length;
	}
	
	// Add position indicator to view
	private void addPositionIndicators(){
		for(int i = 0; i < images.length; i++){
			View v = new View(TutorialActivity.this);
			positionIndicator.addView(v);
			LinearLayout.LayoutParams params = (LinearLayout.LayoutParams) v.getLayoutParams();
			params.width = Utils.dpToPx(10, getResources());
			params.height = Utils.dpToPx(10, getResources());
			params.setMargins(Utils.dpToPx(10, getResources()), 0, 0, 0);
			v.setTag(i);
			setSmallBackground(v);
		}
	}
	
	//Set small background to position indicator
	private void setSmallBackground(View v){
		v.setBackgroundResource(R.drawable.background_small_indicator);
		LayerDrawable layer = (LayerDrawable) v.getBackground();
		GradientDrawable shape =  (GradientDrawable) layer.findDrawableByLayerId(R.id.shape_bacground);
		shape.setColor(colorIndicator);
	}
	//Set big background to position indicator
	private void setBigBackground(View v){
		v.setBackgroundResource(R.drawable.background_big_indicator);
		LayerDrawable layer = (LayerDrawable) v.getBackground();
		GradientDrawable shape =  (GradientDrawable) layer.findDrawableByLayerId(R.id.shape_bacground);
		shape.setColor(colorIndicator);
	}
	
	
	

	// Slide interaction
	float fromTouchPosition = 0;
	float fromViewPosition = -1;
	float fromViewTitlePosition = -1;
	float newPosition;
	@Override
	public boolean onTouch(View arg0, MotionEvent arg1) {
		if(fromViewPosition == -1){
			fromViewPosition = ViewHelper.getX(imageContainer);
			fromViewTitlePosition = ViewHelper.getX(titleContainer);
		}
		switch (arg1.getAction()) {
		case MotionEvent.ACTION_DOWN:
			fromTouchPosition = arg1.getX();
			break;
		case MotionEvent.ACTION_MOVE:
			newPosition = fromViewPosition-(fromTouchPosition-arg1.getX());
			newPosition = (newPosition>0)? 0 : newPosition;
			newPosition = (newPosition< -width*(images.length-1))? -width*(images.length-1) : newPosition;
			ViewHelper.setX(imageContainer,newPosition);
			ViewHelper.setX(titleContainer,fromViewTitlePosition+(newPosition-fromViewPosition)*(widthTitle/width));
			
			break;
		case MotionEvent.ACTION_UP:
			if(newPosition<=(fromViewPosition-width/3)){
				setSmallBackground(positionIndicator.getChildAt(position));
				position++;
				animate();
				fromViewPosition = -position * width;
				fromViewTitlePosition = -position * widthTitle;
				setBigBackground(positionIndicator.getChildAt(position));
			}else if(newPosition>=(fromViewPosition+width/3)){
				setSmallBackground(positionIndicator.getChildAt(position));
				position--;
				animate();
				fromViewPosition = -position * width;
				fromViewTitlePosition = -position * widthTitle;
				setBigBackground(positionIndicator.getChildAt(position));
			}else{
				animate();
				fromViewPosition = -position * width;
				fromViewTitlePosition = -position * widthTitle;
			}
			
			if(position == images.length-1 && !nextButton.isShow)
				nextButton.show();
			else if(nextButton.isShow && position != images.length-1)
				nextButton.hide();
			
			break;

		}
		return true;
	}
	
	//Animate carrousel
	private void animate(){
		ObjectAnimator animator1 = ObjectAnimator.ofFloat(imageContainer, "x", -(position*width));
		animator1.setDuration(300);
		animator1.start();
		ObjectAnimator animator2 = ObjectAnimator.ofFloat(titleContainer, "x", -(position*widthTitle));
		animator2.setDuration(300);
		animator2.start();
	}
	
	


}