package com.ogaclejapan.arclayout.demo;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.AnimatorSet;
import android.animation.ObjectAnimator;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.ActionBar;
import android.support.v7.app.ActionBarActivity;
import android.view.MenuItem;
import android.view.View;
import android.view.animation.AnticipateInterpolator;
import android.view.animation.OvershootInterpolator;
import android.widget.Button;
import android.widget.Toast;

import com.ogaclejapan.arclayout.ArcLayout;

import java.util.ArrayList;
import java.util.List;

public class DemoLikePathActivity extends ActionBarActivity implements View.OnClickListener {

  private static final String KEY_DEMO = "demo";
  Toast toast = null;
  View fab;
  View menuLayout;
  ArcLayout arcLayout;

  public static void startActivity(Context context, Demo demo) {
    Intent intent = new Intent(context, DemoLikePathActivity.class);
    intent.putExtra(KEY_DEMO, demo.name());
    context.startActivity(intent);
  }

  private static Demo getDemo(Intent intent) {
    return Demo.valueOf(intent.getStringExtra(KEY_DEMO));
  }

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.like_a_path);

    Demo demo = getDemo(getIntent());

    ActionBar bar = getSupportActionBar();
    bar.setTitle(demo.titleResId);
    bar.setDisplayHomeAsUpEnabled(true);

    fab = findViewById(R.id.fab);
    menuLayout = findViewById(R.id.menu_layout);
    arcLayout = (ArcLayout) findViewById(R.id.arc_layout);

    for (int i = 0, size = arcLayout.getChildCount(); i < size; i++) {
      arcLayout.getChildAt(i).setOnClickListener(this);
    }

    fab.setOnClickListener(this);
  }

  @Override
  public boolean onOptionsItemSelected(MenuItem item) {
    if (item.getItemId() == android.R.id.home) {
      finish();
      return true;
    }
    return super.onOptionsItemSelected(item);
  }

  @Override
  public void onClick(View v) {
    if (v.getId() == R.id.fab) {
      onFabClick(v);
      return;
    }

    if (v instanceof Button) {
      showToast((Button) v);
    }

  }

  private void showToast(Button btn) {
    if (toast != null) {
      toast.cancel();
    }

    String text = "Clicked: " + btn.getText();
    toast = Toast.makeText(this, text, Toast.LENGTH_SHORT);
    toast.show();

  }

  private void onFabClick(View v) {
    if (v.isSelected()) {
      hideMenu();
    } else {
      showMenu();
    }
    v.setSelected(!v.isSelected());
  }

  @SuppressWarnings("NewApi")
  private void showMenu() {
    menuLayout.setVisibility(View.VISIBLE);

    List<Animator> animList = new ArrayList<>();

    for (int i = 0, len = arcLayout.getChildCount(); i < len; i++) {
      animList.add(createShowItemAnimator(arcLayout.getChildAt(i)));
    }

    AnimatorSet animSet = new AnimatorSet();
    animSet.setDuration(400);
    animSet.setInterpolator(new OvershootInterpolator());
    animSet.playTogether(animList);
    animSet.start();
  }

  @SuppressWarnings("NewApi")
  private void hideMenu() {

    List<Animator> animList = new ArrayList<>();

    for (int i = arcLayout.getChildCount() - 1; i >= 0; i--) {
      animList.add(createHideItemAnimator(arcLayout.getChildAt(i)));
    }

    AnimatorSet animSet = new AnimatorSet();
    animSet.setDuration(400);
    animSet.setInterpolator(new AnticipateInterpolator());
    animSet.playTogether(animList);
    animSet.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        menuLayout.setVisibility(View.INVISIBLE);
      }
    });
    animSet.start();

  }

  private Animator createShowItemAnimator(View item) {

    float dx = fab.getX() - item.getX();
    float dy = fab.getY() - item.getY();

    item.setRotation(0f);
    item.setTranslationX(dx);
    item.setTranslationY(dy);

    Animator anim = ObjectAnimator.ofPropertyValuesHolder(
        item,
        AnimatorUtils.rotation(0f, 720f),
        AnimatorUtils.translationX(dx, 0f),
        AnimatorUtils.translationY(dy, 0f)
    );

    return anim;
  }

  private Animator createHideItemAnimator(final View item) {
    float dx = fab.getX() - item.getX();
    float dy = fab.getY() - item.getY();

    Animator anim = ObjectAnimator.ofPropertyValuesHolder(
        item,
        AnimatorUtils.rotation(720f, 0f),
        AnimatorUtils.translationX(0f, dx),
        AnimatorUtils.translationY(0f, dy)
    );

    anim.addListener(new AnimatorListenerAdapter() {
      @Override
      public void onAnimationEnd(Animator animation) {
        super.onAnimationEnd(animation);
        item.setTranslationX(0f);
        item.setTranslationY(0f);
      }
    });

    return anim;
  }

}