package de.frajul.endlessroll.views;

import android.content.Context;
import android.graphics.drawable.Drawable;
import android.graphics.drawable.GradientDrawable;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.RelativeLayout;

import de.frajul.endlessroll.R;
import de.frajul.endlessroll.entities.tools.ToolSlot;
import de.frajul.endlessroll.entities.tools.ToolType;
import de.frajul.endlessroll.entities.tools.ToolUpgradeType;

/**
 * Created by Julian on 15.01.2016.
 */
public class ToolButton {

    private boolean locked;
    private ToolType toolType;
    private Context context;
    private float progress = 100;
    private boolean active = false;

    private RelativeLayout layout;
    private ProgressBar progressBar;
    private ImageView backgroundView;
    private ImageView animationView;
    private Animation scaleAnimation;

    public ToolButton(ToolSlot slot, Context context, RelativeLayout layout) {
        this.context = context;
        this.layout = layout;
        progressBar = (ProgressBar) layout.findViewById(R.id.tool_button_progress_bar);

        scaleAnimation = AnimationUtils.loadAnimation(context, R.anim.scale_up);
        changeToolSlot(slot);
    }

    public void changeToolSlot(ToolSlot toolSlot) {
        this.toolType = toolSlot.getToolType();
        this.locked = toolSlot.isLocked();
        backgroundView = createImageView(toolType, R.id.tool_button_background_layer);
        animationView = createImageView(toolType, R.id.tool_button_animation_layer);
    }

    private ImageView createImageView(ToolType type, int id) {
        ImageView view = (ImageView) layout.findViewById(id);
        if (locked)
            view.setImageResource(R.drawable.tools_button_locked);
        else if (type != null)
            view.setImageResource(type.getButtonDrawable());
        else
            view.setImageResource(R.drawable.tools_button_empty);
        view.setBackgroundDrawable(createColoredBackground());
        return view;
    }

    private Drawable createColoredBackground() {
        GradientDrawable gd = new GradientDrawable();
        gd.setColor(context.getResources().getColor(R.color.toolbuttonInactiveNotReady));
        if (locked || toolType == null) {
            gd.setColor(context.getResources().getColor(R.color.toolbuttonLocked));
        }
        gd.setCornerRadius(15);
        return gd;
    }

    public void update(float frameTime) {
        if (progress != 100) {
            progress += (frameTime) / (toolType
                    .getCurrentUpgradeValue(ToolUpgradeType.COOLDOWN) / 100);
            progress = Math.min(progress, 100);
            if (progress == 100)
                animationView.startAnimation(scaleAnimation);
        }
        progressBar.setProgress(100 - (int) progress);
        if (!locked && toolType != null) {
            if (active) {
                if (progress == 100)
                    setColor(R.color.toolbuttonActiveReady);
                else
                    setColor(R.color.toolbuttonActiveNotReady);
            } else {
                if (progress == 100)
                    setColor(R.color.toolbuttonInactiveReady);
                else
                    setColor(R.color.toolbuttonInactiveNotReady);
            }
        }
    }

    private void setColor(int id) {
        GradientDrawable gd = (GradientDrawable) backgroundView.getBackground();
        GradientDrawable animGd = (GradientDrawable) animationView.getBackground();
        gd.setColor(context.getResources().getColor(id));
        animGd.setColor(context.getResources().getColor(id));
    }

    public void setActive(boolean active) {
        this.active = active;
    }

    public boolean isActive() {
        return active;
    }

    public void setProgress(int progress) {
        this.progress = progress;
    }

    public boolean finishedLoading() {
        return progress == 100;
    }

    public ToolType getToolType() {
        return toolType;
    }

    public boolean isLocked() {
        return locked;
    }
}
