package zenproject.meditation.android.ui.menu.dialogs.brush.color;

import android.content.Context;
import android.util.AttributeSet;
import android.view.View;
import android.widget.LinearLayout;

import com.novoda.notils.caster.Views;

import de.hdodenhof.circleimageview.CircleImageView;
import zenproject.meditation.android.ContextRetriever;
import zenproject.meditation.android.R;
import zenproject.meditation.android.preferences.BrushOptionsPreferences;
import zenproject.meditation.android.sketch.painting.ink.BrushColor;
import zenproject.meditation.android.ui.menu.dialogs.brush.ColorSelectedListener;


@SuppressWarnings("PMD.TooManyMethods")
public class ColorListView extends LinearLayout {
    private static final int UNSELECTED_BORDER_SIZE = ContextRetriever.INSTANCE.getResources().getDimensionPixelSize(R.dimen.divider_weight);
    private static final int SELECTED_BORDER_SIZE = ContextRetriever.INSTANCE.getResources().getDimensionPixelSize(R.dimen.color_selected_weight);
    private static final int DIVIDER = ContextRetriever.INSTANCE.getResources().getColor(R.color.divider);

    private CircleImageView darkColor;
    private CircleImageView amberColor;
    private CircleImageView eraseColor;
    private CircleImageView primaryColor;
    private CircleImageView accentColor;

    private ColorSelectedListener colorSelectedListener;

    public ColorListView(Context context) {
        super(context);
    }

    public ColorListView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public ColorListView(Context context, AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    @Override
    protected void onFinishInflate() {
        super.onFinishInflate();
        darkColor = Views.findById(this, R.id.dark_brush);
        amberColor = Views.findById(this, R.id.amber_brush);
        eraseColor = Views.findById(this, R.id.erase_brush);
        primaryColor = Views.findById(this, R.id.primary_brush);
        accentColor = Views.findById(this, R.id.accent_brush);

        setSelectedFrom(BrushOptionsPreferences.newInstance().getBrushColor());
    }

    private boolean hasColorSelectedListener() {
        return colorSelectedListener != null;
    }

    public void setColorSelectedListener(ColorSelectedListener colorSelectedListener) {
        this.colorSelectedListener = colorSelectedListener;
    }

    @Override
    protected void onAttachedToWindow() {
        super.onAttachedToWindow();
        darkColor.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelected((CircleImageView) v);
                notifyColorSelected(BrushColor.DARK);
            }
        });
        amberColor.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelected((CircleImageView) v);
                notifyColorSelected(BrushColor.AMBER);
            }
        });
        eraseColor.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelected((CircleImageView) v);
                notifyColorSelected(BrushColor.ERASE);
            }
        });
        primaryColor.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelected((CircleImageView) v);
                notifyColorSelected(BrushColor.PRIMARY);
            }
        });
        accentColor.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                setSelectedWithColor((CircleImageView) v, BrushColor.PRIMARY.color());
                notifyColorSelected(BrushColor.ACCENT);
            }
        });
    }

    private void setSelectedFrom(BrushColor brushColor) {
        if (BrushColor.DARK == brushColor) {
            setSelected(darkColor);
        } else if (BrushColor.AMBER == brushColor) {
            setSelected(amberColor);
        } else if (BrushColor.ERASE == brushColor) {
            setSelected(eraseColor);
        } else if (BrushColor.PRIMARY == brushColor) {
            setSelected(primaryColor);
        } else if (BrushColor.ACCENT == brushColor) {
            setSelectedWithColor(accentColor, BrushColor.PRIMARY.color());
        }
    }

    private void setSelected(CircleImageView circleImageView) {
        deselectAll();
        circleImageView.setBorderColor(BrushColor.ACCENT.color());
        circleImageView.setBorderWidth(SELECTED_BORDER_SIZE);
    }

    private void setSelectedWithColor(CircleImageView circleImageView, int color) {
        deselectAll();
        circleImageView.setBorderColor(color);
        circleImageView.setBorderWidth(SELECTED_BORDER_SIZE);
    }

    private void deselectAll() {
        darkColor.setBorderColor(DIVIDER);
        amberColor.setBorderColor(DIVIDER);
        eraseColor.setBorderColor(DIVIDER);
        primaryColor.setBorderColor(DIVIDER);
        accentColor.setBorderColor(DIVIDER);

        darkColor.setBorderWidth(UNSELECTED_BORDER_SIZE);
        amberColor.setBorderWidth(UNSELECTED_BORDER_SIZE);
        eraseColor.setBorderWidth(UNSELECTED_BORDER_SIZE);
        primaryColor.setBorderWidth(UNSELECTED_BORDER_SIZE);
        accentColor.setBorderWidth(UNSELECTED_BORDER_SIZE);

    }

    @Override
    protected void onDetachedFromWindow() {
        super.onDetachedFromWindow();
        darkColor.setOnClickListener(null);
        amberColor.setOnClickListener(null);
        eraseColor.setOnClickListener(null);
        primaryColor.setOnClickListener(null);
        accentColor.setOnClickListener(null);

    }

    private void notifyColorSelected(BrushColor color) {
        if (hasColorSelectedListener()) {
            colorSelectedListener.onColorSelected(color);
        }
    }
}