package com.etiennelawlor.tinderstack.ui;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.view.ViewGroup;
import android.view.animation.AnticipateOvershootInterpolator;
import android.widget.FrameLayout;

import com.etiennelawlor.tinderstack.bus.RxBus;
import com.etiennelawlor.tinderstack.bus.events.TopCardMovedEvent;
import com.etiennelawlor.tinderstack.utilities.DisplayUtility;

import rx.Subscription;
import rx.android.schedulers.AndroidSchedulers;
import rx.functions.Action1;
import rx.subjects.PublishSubject;
import rx.subscriptions.CompositeSubscription;

/**
 * Created by etiennelawlor on 11/18/16.
 */

public class TinderStackLayout extends FrameLayout {

    // region Constants
    private static final int DURATION = 300;
    // endregion

    // region Member Variables
    private PublishSubject<Integer> publishSubject = PublishSubject.create();
    private CompositeSubscription compositeSubscription;
    private int screenWidth;
    private int yMultiplier;
    // endregion

    // region Constructors
    public TinderStackLayout(Context context) {
        super(context);
        init();
    }

    public TinderStackLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        init();
    }

    public TinderStackLayout(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init();
    }
    // endregion

    @Override
    public void addView(View child, int index, ViewGroup.LayoutParams params) {
        super.addView(child, index, params);
        if(publishSubject != null)
            publishSubject.onNext(getChildCount());
    }

    @Override
    public void removeView(View view) {
        super.removeView(view);
        if(publishSubject != null)
            publishSubject.onNext(getChildCount());
    }

    @Override
    public void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        compositeSubscription.unsubscribe();
    }

    // region Helper Methods
    private void init(){
        setClipChildren(false);

        screenWidth = DisplayUtility.getScreenWidth(getContext());
        yMultiplier = DisplayUtility.dp2px(getContext(), 8);

        compositeSubscription = new CompositeSubscription();

        setUpRxBusSubscription();
    }

    private void setUpRxBusSubscription(){
        Subscription rxBusSubscription = RxBus.getInstance().toObserverable()
                .observeOn(AndroidSchedulers.mainThread()) // UI Thread
                .subscribe(new Action1<Object>() {
                    @Override
                    public void call(Object event) {
                        if (event == null) {
                            return;
                        }

                        if(event instanceof TopCardMovedEvent){
                            float posX = ((TopCardMovedEvent) event).getPosX();

                            int childCount = getChildCount();
                            for(int i=childCount-2; i>=0; i--){
                                TinderCardView tinderCardView = (TinderCardView) getChildAt(i);

                                if(tinderCardView != null){
                                    if(Math.abs(posX) == (float)screenWidth){
                                        float scaleValue = 1 - ((childCount-2-i)/50.0f);

                                        tinderCardView.animate()
                                            .x(0)
                                            .y((childCount-2-i) * yMultiplier)
                                            .scaleX(scaleValue)
                                            .rotation(0)
                                            .setInterpolator(new AnticipateOvershootInterpolator())
                                            .setDuration(DURATION);
                                    } else {
//                                        float multiplier =  (DisplayUtility.dp2px(getContext(), 8)) / (float)screenWidth;
//                                        float dy = -(Math.abs(posX * multiplier));
//                                        tinderCard.setTranslationY(dy);
                                    }
                                }
                            }
                        }
                    }
                });

        compositeSubscription.add(rxBusSubscription);
    }

    public PublishSubject<Integer> getPublishSubject() {
        return publishSubject;
    }

    public void addCard(TinderCardView tc){
        ViewGroup.LayoutParams layoutParams; layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);

        int childCount = getChildCount();
        addView(tc, 0, layoutParams);

        float scaleValue = 1 - (childCount/50.0f);

        tc.animate()
            .x(0)
            .y(childCount * yMultiplier)
            .scaleX(scaleValue)
            .setInterpolator(new AnticipateOvershootInterpolator())
            .setDuration(DURATION);
    }
    // endregion
}