package com.mobify.astro.plugins.counterbadgeplugin;

import android.graphics.Color;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.support.annotation.NonNull;
import android.view.View;
import android.widget.ImageView;
import android.widget.RelativeLayout;

import com.mobify.astro.AstroActivity;
import com.mobify.astro.AstroPlugin;
import com.mobify.astro.PluginResolver;
import com.mobify.astro.R;
import com.mobify.astro.messaging.EventRegistrar;
import com.mobify.astro.messaging.MessageSender;
import com.mobify.astro.messaging.annotations.RpcMethod;
import com.mobify.astro.utilities.DrawableUriResolver;

public class CounterBadgePlugin extends AstroPlugin {

    private static final String TAG = CounterBadgePlugin.class.getName();

    private static final int INITIAL_COUNT = 0;
    private static final String INITIAL_BACKGROUND_COLOR = "#FF0000";
    private static final String INITIAL_TEXT_COLOR = "#FFFFFF";

    private RelativeLayout containerView;
    protected ImageView imageView;
    protected BadgeView badgeView;

    public CounterBadgePlugin(@NonNull AstroActivity activity, @NonNull PluginResolver pluginResolver,
                              @NonNull EventRegistrar eventRegistrar, @NonNull MessageSender messageSender) {
        super(activity, pluginResolver, eventRegistrar, messageSender);

        //region container view

        RelativeLayout.LayoutParams countainerLayout = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );

        containerView = new RelativeLayout(activity);
        containerView.setLayoutParams(countainerLayout);

        //endregion

        //region image view

        final int headerIconSize = activity.getResources().getDimensionPixelSize(R.dimen.header_bar_item_min_size);

        RelativeLayout.LayoutParams imageLayout = new RelativeLayout.LayoutParams(
                headerIconSize,
                headerIconSize
        );

        imageView = new ImageView(activity);
        imageView.setScaleType(ImageView.ScaleType.CENTER);
        imageView.setId(R.id.counter_badge_image_id);
        imageView.setLayoutParams(imageLayout);

        //endregion

        //region badge view

        RelativeLayout.LayoutParams badgeLayout = new RelativeLayout.LayoutParams(
                RelativeLayout.LayoutParams.WRAP_CONTENT,
                RelativeLayout.LayoutParams.WRAP_CONTENT
        );

        final int badgeMargin = activity.getResources().getDimensionPixelSize(R.dimen.counter_badge_margin);
        badgeLayout.topMargin = badgeMargin;
        badgeLayout.rightMargin = badgeMargin;
        badgeLayout.addRule(RelativeLayout.ALIGN_END, R.id.counter_badge_image_id);
        badgeLayout.addRule(RelativeLayout.ALIGN_TOP, R.id.counter_badge_image_id);

        final int badgePadding = activity.getResources().getDimensionPixelSize(R.dimen.counter_badge_padding);

        badgeView = new BadgeView(activity);
        badgeView.setLayoutParams(badgeLayout);
        badgeView.setPadding(badgePadding, 0, badgePadding, 0);

        //endregion

        containerView.addView(imageView);
        containerView.addView(badgeView);

        setCount(INITIAL_COUNT);
        setBackgroundColor(INITIAL_BACKGROUND_COLOR);
        setTextColor(INITIAL_TEXT_COLOR);
    }

    @Override
    public View getView() {
        return containerView;
    }

    @RpcMethod(methodName = "setImagePath", parameterNames = {"path"})
    public void setImagePath(String path) throws Exception {
        Uri uri = Uri.parse(path);
        Drawable image = new DrawableUriResolver(activity).getLocalDrawable(uri);
        imageView.setImageDrawable(image);
    }

    @RpcMethod(methodName = "setCount", parameterNames = {"count"})
    public void setCount(int count) {
        if (count > 0) {
            badgeView.setCount(count + "");
            badgeView.setVisibility(View.VISIBLE);
        } else {
            badgeView.setText("");
            badgeView.setVisibility(View.INVISIBLE);
        }
    }

    @RpcMethod(methodName = "setBackgroundColor", parameterNames = {"color"})
    public void setBackgroundColor(String color) {
        int backgroundColor = Color.parseColor(color);
        badgeView.setBackgroundColor(backgroundColor);
    }

    @RpcMethod(methodName = "setTextColor", parameterNames = {"color"})
    public void setTextColor(String color) {
        int textColor = Color.parseColor(color);
        badgeView.setTextColor(textColor);
    }
}