/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License
 */

package com.android.systemui.statusbar;

import android.view.View;
import android.view.ViewPropertyAnimator;
import android.view.animation.AnimationUtils;
import android.view.animation.Interpolator;

import java.util.HashMap;
import java.util.Map;

/**
 * A state of a {@link com.android.systemui.statusbar.SpeedBumpDotsLayout}
 */
public class SpeedBumpDotsState {

    public static final int HIDDEN = 1;
    public static final int SHOWN = 2;
    private static final int VISIBILITY_ANIMATION_DELAY_PER_ELEMENT = 80;

    private final SpeedBumpDotsLayout mHostView;
    private final HashMap<View, ViewState> mStateMap = new HashMap<View, ViewState>();
    private final Interpolator mFastOutSlowInInterpolator;
    private int mActiveState = 0;

    public SpeedBumpDotsState(SpeedBumpDotsLayout hostLayout) {
        mHostView = hostLayout;
        mFastOutSlowInInterpolator = AnimationUtils
                .loadInterpolator(hostLayout.getContext(),
                        android.R.interpolator.fast_out_slow_in);
    }

    public SpeedBumpDotsLayout getHostView() {
        return mHostView;
    }

    public void resetViewStates() {
        int numChildren = mHostView.getChildCount();
        for (int i = 0; i < numChildren; i++) {
            View child = mHostView.getChildAt(i);
            ViewState viewState = mStateMap.get(child);
            if (viewState == null) {
                viewState = new ViewState();
                mStateMap.put(child, viewState);
            }
        }
    }

    public ViewState getViewStateForView(View requestedView) {
        return mStateMap.get(requestedView);
    }

    public void apply() {
        int childCount = mHostView.getChildCount();
        for (int i = 0; i < childCount; i++) {
            View child = mHostView.getChildAt(i);
            ViewState viewState = mStateMap.get(child);

            child.setTranslationX(viewState.xTranslation);
            child.setTranslationY(viewState.yTranslation);
            child.setScaleX(viewState.scale);
            child.setScaleY(viewState.scale);
            child.setAlpha(viewState.alpha);
        }
    }

    public void animateToState() {
        int childCount = mHostView.getChildCount();
        int middleIndex = (childCount - 1) / 2;
        long delayPerElement = VISIBILITY_ANIMATION_DELAY_PER_ELEMENT;
        boolean isAppearing = getActiveState() == SHOWN;
        boolean isDisappearing = getActiveState() == HIDDEN;
        for (int i = 0; i < childCount; i++) {
            int delayIndex;
            if (i <= middleIndex) {
                delayIndex = i * 2;
            } else {
                int distToMiddle = i - middleIndex;
                delayIndex = (childCount - 1) - (distToMiddle - 1) * 2;
            }
            long startDelay = 0;
            if (isAppearing || isDisappearing) {
                if (isDisappearing) {
                    delayIndex = childCount - 1 - delayIndex;
                }
                startDelay = delayIndex * delayPerElement;
            }
            View child = mHostView.getChildAt(i);
            ViewState viewState = mStateMap.get(child);
            child.animate().setInterpolator(mFastOutSlowInInterpolator)
                    .setStartDelay(startDelay)
                    .alpha(viewState.alpha)
                    .translationX(viewState.xTranslation)
                    .translationY(viewState.yTranslation)
                    .scaleX(viewState.scale).scaleY(viewState.scale);
        }
    }

    public int getActiveState() {
        return mActiveState;
    }

    public void setActiveState(int mActiveState) {
        this.mActiveState = mActiveState;
    }

    public static class ViewState {
        float xTranslation;
        float yTranslation;
        float alpha;
        float scale;
    }
}
