/*
 * Copyright (C) 2015 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.notification.row;

import android.annotation.Nullable;
import android.app.Notification;
import android.content.Context;
import android.content.res.Resources;
import android.service.notification.StatusBarNotification;
import android.util.TypedValue;
import android.view.ContextThemeWrapper;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.android.internal.widget.ConversationLayout;
import com.android.systemui.R;

/**
 * A class managing hybrid groups that include {@link HybridNotificationView} and the notification
 * group overflow.
 */
public class HybridGroupManager {

    private final Context mContext;

    private float mOverflowNumberSize;
    private int mOverflowNumberPadding;

    private int mOverflowNumberColor;

    public HybridGroupManager(Context ctx) {
        mContext = ctx;
        initDimens();
    }

    public void initDimens() {
        Resources res = mContext.getResources();
        mOverflowNumberSize = res.getDimensionPixelSize(R.dimen.group_overflow_number_size);
        mOverflowNumberPadding = res.getDimensionPixelSize(R.dimen.group_overflow_number_padding);
    }

    private HybridNotificationView inflateHybridViewWithStyle(int style,
            View contentView, ViewGroup parent) {
        LayoutInflater inflater = new ContextThemeWrapper(mContext, style)
                .getSystemService(LayoutInflater.class);
        int layout = contentView instanceof ConversationLayout
                ? R.layout.hybrid_conversation_notification
                : R.layout.hybrid_notification;
        HybridNotificationView hybrid = (HybridNotificationView)
                inflater.inflate(layout, parent, false);
        parent.addView(hybrid);
        return hybrid;
    }

    private TextView inflateOverflowNumber(ViewGroup parent) {
        LayoutInflater inflater = mContext.getSystemService(LayoutInflater.class);
        TextView numberView = (TextView) inflater.inflate(
                R.layout.hybrid_overflow_number, parent, false);
        parent.addView(numberView);
        updateOverFlowNumberColor(numberView);
        return numberView;
    }

    private void updateOverFlowNumberColor(TextView numberView) {
        numberView.setTextColor(mOverflowNumberColor);
    }

    public void setOverflowNumberColor(TextView numberView, int colorRegular) {
        mOverflowNumberColor = colorRegular;
        if (numberView != null) {
            updateOverFlowNumberColor(numberView);
        }
    }

    public HybridNotificationView bindFromNotification(HybridNotificationView reusableView,
            View contentView, StatusBarNotification notification,
            ViewGroup parent) {
        return bindFromNotificationWithStyle(reusableView, contentView, notification,
                R.style.HybridNotification, parent);
    }

    private HybridNotificationView bindFromNotificationWithStyle(
            HybridNotificationView reusableView, View contentView,
            StatusBarNotification notification,
            int style, ViewGroup parent) {
        if (reusableView == null) {
            reusableView = inflateHybridViewWithStyle(style, contentView, parent);
        }
        CharSequence titleText = resolveTitle(notification.getNotification());
        CharSequence contentText = resolveText(notification.getNotification());
        reusableView.bind(titleText, contentText, contentView);
        return reusableView;
    }

    @Nullable
    public static CharSequence resolveText(Notification notification) {
        CharSequence contentText = notification.extras.getCharSequence(Notification.EXTRA_TEXT);
        if (contentText == null) {
            contentText = notification.extras.getCharSequence(Notification.EXTRA_BIG_TEXT);
        }
        return contentText;
    }

    @Nullable
    public static CharSequence resolveTitle(Notification notification) {
        CharSequence titleText = notification.extras.getCharSequence(Notification.EXTRA_TITLE);
        if (titleText == null) {
            titleText = notification.extras.getCharSequence(Notification.EXTRA_TITLE_BIG);
        }
        return titleText;
    }

    public TextView bindOverflowNumber(TextView reusableView, int number,
            ViewGroup parent) {
        if (reusableView == null) {
            reusableView = inflateOverflowNumber(parent);
        }
        String text = mContext.getResources().getString(
                R.string.notification_group_overflow_indicator, number);
        if (!text.equals(reusableView.getText())) {
            reusableView.setText(text);
        }
        String contentDescription = String.format(mContext.getResources().getQuantityString(
                R.plurals.notification_group_overflow_description, number), number);

        reusableView.setContentDescription(contentDescription);
        reusableView.setTextSize(TypedValue.COMPLEX_UNIT_PX, mOverflowNumberSize);
        reusableView.setPaddingRelative(reusableView.getPaddingStart(),
                reusableView.getPaddingTop(), mOverflowNumberPadding,
                reusableView.getPaddingBottom());
        updateOverFlowNumberColor(reusableView);
        return reusableView;
    }
}
