/*
 * Copyright 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.car.apps.common;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.constraintlayout.widget.ConstraintLayout;

import com.android.car.apps.common.util.ViewUtils;

/**
 * This is a compact CarControlBar that provides a fixed number of controls (with no overflow),
 * along with some metadata (title, subtitle, icon)
 */
public class MinimizedControlBar extends ConstraintLayout implements CarControlBar {

    // All slots in this action bar where 0 is the bottom-start corner of the matrix, and
    // mNumColumns * nNumRows - 1 is the top-end corner
    private FrameLayout[] mSlots;

    /** Views to set in a particular {@link ControlBar.SlotPosition} */
    private final View[] mFixedViews = new View[3];
    // Holds the views to show as buttons
    private View[] mViews;

    protected TextView mTitle;
    protected TextView mSubtitle;
    protected ImageView mContentTile;

    private static final int NUM_COLUMNS = 3;

    public MinimizedControlBar(Context context) {
        this(context, null, 0);
    }

    public MinimizedControlBar(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }


    public MinimizedControlBar(Context context, AttributeSet attrs, int defStyleAttrs) {
        this(context, attrs, defStyleAttrs, R.layout.minimized_control_bar);
    }

    protected MinimizedControlBar(Context context, AttributeSet attrs, int defStyleAttrs,
            int layoutId) {
        super(context, attrs, defStyleAttrs);
        init(context, layoutId);
    }

    private void init(Context context, int layoutId) {
        inflate(context, layoutId, this);
        mViews = new View[NUM_COLUMNS];
        mTitle = findViewById(R.id.minimized_control_bar_title);
        mSubtitle = findViewById(R.id.minimized_control_bar_subtitle);
        mContentTile = findViewById(R.id.minimized_control_bar_content_tile);

        mSlots = new FrameLayout[NUM_COLUMNS];

        mSlots[0] = findViewById(R.id.minimized_control_bar_left_slot);
        mSlots[1] = findViewById(R.id.minimized_control_bar_main_slot);
        mSlots[2] = findViewById(R.id.minimized_control_bar_right_slot);
    }

    @Override
    public void setView(@Nullable View view, @SlotPosition int slotPosition) {
        mFixedViews[slotPosition] = view;
        updateViewsLayout();
    }

    @Override
    public void setViews(@Nullable View[] views) {
        mViews = views;
        updateViewsLayout();
    }

    @Override
    public ImageButton createIconButton(Drawable icon) {
        return createIconButton(icon, R.layout.control_bar_button);
    }

    @Override
    public ImageButton createIconButton(Drawable icon, int viewId) {
        LayoutInflater inflater = LayoutInflater.from(mSlots[0].getContext());
        final boolean attachToRoot = false;
        ImageButton button = (ImageButton) inflater.inflate(viewId, mSlots[0], attachToRoot);
        button.setImageDrawable(icon);
        return button;
    }

    private void updateViewsLayout() {
        int viewIndex = 0;
        // Fill in slots with provided views
        for (int i = 0; i < NUM_COLUMNS; i++) {
            View viewToUse = null;
            if (mFixedViews[i] != null) {
                viewToUse = mFixedViews[i];
            } else if (mViews != null && viewIndex < mViews.length) {
                // If views are not provided explicitly for a slot, use the next value in the list
                viewToUse = mViews[viewIndex];
                viewIndex++;
            }
            ViewUtils.setView(viewToUse, mSlots[CarControlBar.getSlotIndex(i, NUM_COLUMNS)]);
        }
    }
}
