/*
 * Copyright (C) 2011 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.browser.addbookmark;

import com.android.browser.R;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.view.Gravity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

/**
 * SpinnerAdapter used in the AddBookmarkPage to select where to save a
 * bookmark/folder.
 */
public class FolderSpinnerAdapter extends BaseAdapter {

    public static final int HOME_SCREEN = 0;
    public static final int ROOT_FOLDER = 1;
    public static final int OTHER_FOLDER = 2;
    public static final int RECENT_FOLDER = 3;

    private boolean mIncludeHomeScreen;
    private boolean mIncludesRecentFolder;
    private long mRecentFolderId;
    private String mRecentFolderName;
    private LayoutInflater mInflater;
    private Context mContext;
    private String mOtherFolderDisplayText;

    public FolderSpinnerAdapter(Context context, boolean includeHomeScreen) {
        mIncludeHomeScreen = includeHomeScreen;
        mContext = context;
        mInflater = LayoutInflater.from(mContext);
    }

    public void addRecentFolder(long folderId, String folderName) {
        mIncludesRecentFolder = true;
        mRecentFolderId = folderId;
        mRecentFolderName = folderName;
    }

    public long recentFolderId() { return mRecentFolderId; }

    private void bindView(int position, View view, boolean isDropDown) {
        int labelResource;
        int drawableResource;
        if (!mIncludeHomeScreen) {
            position++;
        }
        switch (position) {
            case HOME_SCREEN:
                labelResource = R.string.add_to_homescreen_menu_option;
                drawableResource = R.drawable.ic_home_holo_dark;
                break;
            case ROOT_FOLDER:
                labelResource = R.string.add_to_bookmarks_menu_option;
                drawableResource = R.drawable.ic_bookmarks_holo_dark;
                break;
            case RECENT_FOLDER:
                // Fall through and use the same icon resource
            case OTHER_FOLDER:
                labelResource = R.string.add_to_other_folder_menu_option;
                drawableResource = R.drawable.ic_folder_holo_dark;
                break;
            default:
                labelResource = 0;
                drawableResource = 0;
                // assert
                break;
        }
        TextView textView = (TextView) view;
        if (position == RECENT_FOLDER) {
            textView.setText(mRecentFolderName);
        } else if (position == OTHER_FOLDER && !isDropDown
                && mOtherFolderDisplayText != null) {
            textView.setText(mOtherFolderDisplayText);
        } else {
            textView.setText(labelResource);
        }
        textView.setGravity(Gravity.CENTER_VERTICAL);
        Drawable drawable = mContext.getResources().getDrawable(drawableResource);
        textView.setCompoundDrawablesWithIntrinsicBounds(drawable, null,
                null, null);
    }

    @Override
    public View getDropDownView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(
                    android.R.layout.simple_spinner_dropdown_item, parent, false);
        }
        bindView(position, convertView, true);
        return convertView;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = mInflater.inflate(android.R.layout.simple_spinner_item,
                    parent, false);
        }
        bindView(position, convertView, false);
        return convertView;
    }

    @Override
    public int getCount() {
        int count = 2;
        if (mIncludeHomeScreen) count++;
        if (mIncludesRecentFolder) count++;
        return count;
    }

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

    @Override
    public long getItemId(int position) {
        long id = position;
        if (!mIncludeHomeScreen) {
            id++;
        }
        return id;
    }

    @Override
    public boolean hasStableIds() {
        return true;
    }

    public void setOtherFolderDisplayText(String parentTitle) {
        mOtherFolderDisplayText = parentTitle;
        notifyDataSetChanged();
    }

    public void clearRecentFolder() {
        if (mIncludesRecentFolder) {
            mIncludesRecentFolder = false;
            notifyDataSetChanged();
        }
    }
}
