/*
 * Copyright (C) 2019 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.settings.homepage.contextualcards.slices;

import android.graphics.Canvas;
import android.view.View;

import androidx.annotation.NonNull;
import androidx.recyclerview.widget.ItemTouchHelper;
import androidx.recyclerview.widget.RecyclerView;

import com.android.settings.R;
import com.android.settings.homepage.contextualcards.ContextualCard;

public class SwipeDismissalDelegate extends ItemTouchHelper.Callback {

    private static final String TAG = "SwipeDismissalDelegate";

    public interface Listener {
        void onSwiped(int position);
    }

    private final SwipeDismissalDelegate.Listener mListener;

    public SwipeDismissalDelegate(SwipeDismissalDelegate.Listener listener) {
        mListener = listener;
    }

    /**
     * Determine whether the ability to drag or swipe should be enabled or not.
     *
     * Only allow swipe on {@link ContextualCard} built with view type
     * {@link SliceContextualCardRenderer#VIEW_TYPE_FULL_WIDTH} or
     * {@link SliceContextualCardRenderer#VIEW_TYPE_HALF_WIDTH}.
     *
     * When the dismissal view is displayed, the swipe will also be disabled.
     */
    @Override
    public int getMovementFlags(@NonNull RecyclerView recyclerView,
            @NonNull RecyclerView.ViewHolder viewHolder) {
        switch (viewHolder.getItemViewType()) {
            case SliceContextualCardRenderer.VIEW_TYPE_FULL_WIDTH:
            case SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH:
                // Here we are making sure the current displayed view is the initial view of
                // either slice full card or half card, and only allow swipe on these two types.
                if (viewHolder.itemView.findViewById(R.id.dismissal_view).getVisibility()
                        == View.VISIBLE) {
                    // Disable swiping when we are in the dismissal view
                    return 0;
                }
                return makeMovementFlags(0 /*dragFlags*/,
                        ItemTouchHelper.LEFT | ItemTouchHelper.RIGHT /*swipeFlags*/);
            default:
                return 0;
        }
    }

    @Override
    public boolean onMove(@NonNull RecyclerView recyclerView,
            @NonNull RecyclerView.ViewHolder viewHolder,
            @NonNull RecyclerView.ViewHolder target) {
        return false;
    }

    @Override
    public void onSwiped(@NonNull RecyclerView.ViewHolder viewHolder, int direction) {
        mListener.onSwiped(viewHolder.getAdapterPosition());
    }

    @Override
    public void clearView(@NonNull RecyclerView recyclerView,
            @NonNull RecyclerView.ViewHolder viewHolder) {
        final View view = getSwipeableView(viewHolder);
        getDefaultUIUtil().clearView(view);
    }

    @Override
    public void onChildDraw(@NonNull Canvas c, @NonNull RecyclerView recyclerView,
            @NonNull RecyclerView.ViewHolder viewHolder, float dX, float dY, int actionState,
            boolean isCurrentlyActive) {
        final View view = getSwipeableView(viewHolder);
        final View iconStart = viewHolder.itemView.findViewById(R.id.dismissal_icon_start);
        final View iconEnd = viewHolder.itemView.findViewById(R.id.dismissal_icon_end);

        if (dX > 0) {
            iconStart.setVisibility(View.VISIBLE);
            iconEnd.setVisibility(View.GONE);
        } else if (dX < 0) {
            iconStart.setVisibility(View.GONE);
            iconEnd.setVisibility(View.VISIBLE);
        }
        getDefaultUIUtil().onDraw(c, recyclerView, view, dX, dY, actionState, isCurrentlyActive);
    }

    /**
     * Get the foreground view from the {@link android.widget.FrameLayout} as we only swipe
     * the foreground out in {@link SwipeDismissalDelegate#onChildDraw} and gets the view
     * beneath revealed.
     *
     * @return The foreground view.
     */
    private View getSwipeableView(RecyclerView.ViewHolder viewHolder) {
        if (viewHolder.getItemViewType() == SliceContextualCardRenderer.VIEW_TYPE_HALF_WIDTH) {
            return ((SliceHalfCardRendererHelper.HalfCardViewHolder) viewHolder).content;
        }
        return ((SliceFullCardRendererHelper.SliceViewHolder) viewHolder).sliceView;
    }
}