package com.reindeercrafts.notificationpeek.blacklist;

import android.animation.Animator;
import android.animation.AnimatorListenerAdapter;
import android.animation.ValueAnimator;
import android.content.Context;
import android.content.SharedPreferences;
import android.preference.PreferenceManager;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewTreeObserver;
import android.view.animation.DecelerateInterpolator;
import android.widget.Button;
import android.widget.RelativeLayout;
import android.widget.TextView;
import android.widget.ViewSwitcher;

import com.reindeercrafts.notificationpeek.R;
import com.reindeercrafts.notificationpeek.settings.PreferenceKeys;

/**
 * Subclass of RelativeLayout to display everything black list item's functionality:
 * - Disable Peek.
 * - Setup quiet hour.
 *
 * Created by zhelu on 5/26/14.
 */
public class EverythingCard extends RelativeLayout implements View.OnClickListener {

    private static final long ANIM_DURATION = 300;
    private static final java.lang.String DELIMITER = "|";

    private ViewSwitcher mPanelSwitcher;
    private Button mFromBtn;
    private Button mToBtn;
    private TextView mFromToText;

    private QuietHour mQuietHour;

    // Quiet hour or disable button callback.
    private OnPanelButtonClickedListener mOnPanelButtonClickedListener;

    private boolean mOptionsShowing = true;

    public void setOnPanelButtonClickedListener(OnPanelButtonClickedListener listener) {
        this.mOnPanelButtonClickedListener = listener;
    }

    public EverythingCard(Context context) {
        super(context);
    }

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

    public EverythingCard(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
        init(context);
    }

    private void init(Context context) {

        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(context);

        boolean isPeekDisabled = preferences.getBoolean(PreferenceKeys.PREF_DISABLE_PEEK, false);
        String quietHourStr = preferences
                .getString(PreferenceKeys.PREF_QUIET_HOUR, PreferenceKeys.PREF_QUIET_HOUR_DEF);
        boolean isQuietHourSet = !quietHourStr.equals(PreferenceKeys.PREF_QUIET_HOUR_DEF);

        mOptionsShowing = !(isPeekDisabled || isQuietHourSet);
        mQuietHour = QuietHour.createQuietHour(quietHourStr);

        LayoutInflater.from(context).inflate(R.layout.everything_card, this, true);
        mPanelSwitcher = (ViewSwitcher) findViewById(R.id.view_switcher);
        if (!mOptionsShowing) {
            mPanelSwitcher.setVisibility(GONE);
        }

        mFromBtn = (Button) findViewById(R.id.quiet_hour_from_btn);
        mFromBtn.setOnClickListener(this);

        mToBtn = (Button) findViewById(R.id.quiet_hour_to_btn);
        mToBtn.setOnClickListener(this);

        Button mQuietHourBtn = (Button) findViewById(R.id.quiet_hour_btn);
        mQuietHourBtn.setOnClickListener(this);

        Button mDisableBtn = (Button) findViewById(R.id.as_is_btn);
        mDisableBtn.setOnClickListener(this);

        mFromToText = (TextView) findViewById(R.id.from_to_text);
        if (isQuietHourSet) {
            displayTime();
        }
        mFromToText.setOnClickListener(this);
    }

    /* Update instance's current "from" time. */
    public void setFromTime(int hr, int min) {
        mQuietHour.setFromTime(hr, min);

        mFromBtn.setText(mQuietHour.getFromTimeText());

        if (mQuietHour.isBothTimeSet()) {
            displayTime();
            hideOptions();
            storeQuietHour();
        }
    }

    /* Update instance's current "to" time. */
    public void setToTime(int hr, int min) {
        mQuietHour.setToTime(hr, min);

        mToBtn.setText(mQuietHour.getToTimeText());

        if (mQuietHour.isBothTimeSet()) {
            displayTime();
            hideOptions();
            storeQuietHour();
        }
    }


    /* Store instance's QuietHour object. */
    private void storeQuietHour(){
        SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(getContext());
        preferences.edit().putString(PreferenceKeys.PREF_QUIET_HOUR, mQuietHour.toString()).apply();
    }

    private void displayTime() {
        mFromToText.setVisibility(VISIBLE);
        mFromToText.setText(mQuietHour.getDisplayTime(getContext()));
    }

    private void hideOptions() {
        if (!mOptionsShowing) {
            return;
        }

        mQuietHour.reset();
        if (mPanelSwitcher.getDisplayedChild() == 1) {
            mPanelSwitcher.showPrevious();
        }

        final int originalHeight = mPanelSwitcher.getHeight();
        ValueAnimator animator = ValueAnimator.ofInt(mPanelSwitcher.getHeight(), 0);
        animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
            @Override
            public void onAnimationUpdate(ValueAnimator animation) {
                ViewGroup.LayoutParams params = mPanelSwitcher.getLayoutParams();
                params.height = (Integer) animation.getAnimatedValue();
                mPanelSwitcher.setLayoutParams(params);
            }
        });

        animator.setDuration(ANIM_DURATION);
        animator.setInterpolator(new DecelerateInterpolator());
        animator.addListener(new AnimatorListenerAdapter() {
            @Override
            public void onAnimationEnd(Animator animation) {
                super.onAnimationEnd(animation);
                mPanelSwitcher.setVisibility(GONE);
                ViewGroup.LayoutParams params = mPanelSwitcher.getLayoutParams();
                params.height = originalHeight;
                mPanelSwitcher.setLayoutParams(params);
                mFromBtn.setText(getContext().getString(R.string.from));
                mToBtn.setText(getContext().getString(R.string.to));
            }
        });

        animator.start();
        mOptionsShowing = false;
    }

    private void showOptions() {
        if (mOptionsShowing) {
            return;
        }
        ViewTreeObserver observer = mPanelSwitcher.getViewTreeObserver();
        observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
            @Override
            public boolean onPreDraw() {
                ViewTreeObserver observer= mPanelSwitcher.getViewTreeObserver();
                observer.removeOnPreDrawListener(this);
                ValueAnimator animator = ValueAnimator.ofInt(0, mPanelSwitcher.getHeight());
                animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
                    @Override
                    public void onAnimationUpdate(ValueAnimator animation) {
                        ViewGroup.LayoutParams params = mPanelSwitcher.getLayoutParams();
                        params.height = (Integer) animation.getAnimatedValue();
                        mPanelSwitcher.setLayoutParams(params);
                    }
                });

                animator.setDuration(ANIM_DURATION);
                animator.setInterpolator(new DecelerateInterpolator());
                animator.start();
                return false;
            }
        });

        mPanelSwitcher.setVisibility(VISIBLE);
        mOptionsShowing = true;


    }

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            case R.id.quiet_hour_btn:
                mPanelSwitcher.showNext();
                break;

            case R.id.as_is_btn:
                if (mOnPanelButtonClickedListener != null) {
                    mOnPanelButtonClickedListener.onPanelButtonClicked(PanelButtons.BTN_DISABLE);
                }
                SharedPreferences preferences =
                        PreferenceManager.getDefaultSharedPreferences(getContext());
                preferences.edit().putBoolean(PreferenceKeys.PREF_DISABLE_PEEK, true)
                        .remove(PreferenceKeys.PREF_QUIET_HOUR).apply();

                mFromToText.setVisibility(GONE);
                hideOptions();
                break;

            case R.id.quiet_hour_from_btn:
                if (mOnPanelButtonClickedListener != null) {
                    mOnPanelButtonClickedListener
                            .onPanelButtonClicked(PanelButtons.BTN_QUIET_HOUR_FROM);
                }

                break;

            case R.id.quiet_hour_to_btn:
                if (mOnPanelButtonClickedListener != null) {
                    mOnPanelButtonClickedListener
                            .onPanelButtonClicked(PanelButtons.BTN_QUIET_HOUR_TO);
                }
                break;

            case R.id.from_to_text:
                // Toggle options panel.
                if (mOptionsShowing) {
                    hideOptions();
                } else {
                    showOptions();
                }
                break;
        }

    }

    /**
     * Callback used to associate actions to the button click event.
     */
    public interface OnPanelButtonClickedListener {
        // Called when an action button in EverythingCard is clicked.
        void onPanelButtonClicked(PanelButtons button);
    }

    /**
     * Button action types.
     */
    public enum PanelButtons {
        BTN_QUIET_HOUR_FROM,
        BTN_QUIET_HOUR_TO,
        BTN_DISABLE
    }

}