// Copyright 2013 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

package org.chromium.ui;

import android.content.Context;
import android.graphics.Color;
import android.graphics.drawable.GradientDrawable;
import android.graphics.drawable.LayerDrawable;
import android.text.TextUtils;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.LinearLayout;

import org.chromium.base.ApiCompatibilityUtils;

/**
 * The adapter used to populate ColorPickerSimple.
 */
public class ColorSuggestionListAdapter extends BaseAdapter implements View.OnClickListener {
    private Context mContext;
    private ColorSuggestion[] mSuggestions;
    private OnColorSuggestionClickListener mListener;

    /**
     * The callback used to indicate the user has clicked on a suggestion.
     */
    public interface OnColorSuggestionClickListener {

        /**
         * Called upon a click on a suggestion.
         *
         * @param suggestion The suggestion that was clicked.
         */
        void onColorSuggestionClick(ColorSuggestion suggestion);
    }

    private static final int COLORS_PER_ROW = 4;

    ColorSuggestionListAdapter(Context context, ColorSuggestion[] suggestions) {
        mContext = context;
        mSuggestions = suggestions;
    }

    /**
     * Sets the listener that will be notified upon a click on a suggestion.
     */
    public void setOnColorSuggestionClickListener(OnColorSuggestionClickListener listener) {
        mListener = listener;
    }

    /**
     * Sets up the color button to represent a color suggestion.
     *
     * @param button The button view to set up.
     * @param index The index of the suggestion in mSuggestions.
     */
    private void setUpColorButton(View button, int index) {
        if (index >= mSuggestions.length) {
            button.setTag(null);
            button.setContentDescription(null);
            button.setVisibility(View.INVISIBLE);
            return;
        }
        button.setTag(mSuggestions[index]);
        button.setVisibility(View.VISIBLE);
        ColorSuggestion suggestion = mSuggestions[index];
        LayerDrawable layers = (LayerDrawable) button.getBackground();
        GradientDrawable swatch =
                (GradientDrawable) layers.findDrawableByLayerId(R.id.color_button_swatch);
        swatch.setColor(suggestion.mColor);
        String description = suggestion.mLabel;
        if (TextUtils.isEmpty(description)) {
            description = String.format("#%06X", (0xFFFFFF & suggestion.mColor));
        }
        button.setContentDescription(description);
        button.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {
        if (mListener == null) {
            return;
        }
        ColorSuggestion suggestion = (ColorSuggestion) v.getTag();
        if (suggestion == null) {
            return;
        }
        mListener.onColorSuggestionClick(suggestion);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LinearLayout layout;
        if (convertView != null && convertView instanceof LinearLayout) {
            layout = (LinearLayout) convertView;
        } else {
            layout = new LinearLayout(mContext);
            layout.setLayoutParams(new AbsListView.LayoutParams(
                    AbsListView.LayoutParams.MATCH_PARENT,
                    AbsListView.LayoutParams.WRAP_CONTENT));
            layout.setOrientation(LinearLayout.HORIZONTAL);
            layout.setBackgroundColor(Color.WHITE);
            int buttonHeight =
                mContext.getResources().getDimensionPixelOffset(R.dimen.color_button_height);
            for (int i = 0; i < COLORS_PER_ROW; ++i) {
                View button = new View(mContext);
                LinearLayout.LayoutParams layoutParams =
                        new LinearLayout.LayoutParams(0, buttonHeight, 1f);
                ApiCompatibilityUtils.setMarginStart(layoutParams, -1);
                if (i == COLORS_PER_ROW - 1) {
                    ApiCompatibilityUtils.setMarginEnd(layoutParams, -1);
                }
                button.setLayoutParams(layoutParams);
                button.setBackgroundResource(R.drawable.color_button_background);
                layout.addView(button);
            }
        }
        for (int i = 0; i < COLORS_PER_ROW; ++i) {
            setUpColorButton(layout.getChildAt(i), position * COLORS_PER_ROW + i);
        }
        return layout;
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public Object getItem(int position) {
        return null;
    }

    @Override
    public int getCount() {
        return (mSuggestions.length + COLORS_PER_ROW - 1) / COLORS_PER_ROW;
    }
}
