package com.koushikdutta.boilerplate.tint;

import android.content.Context;
import android.content.res.ColorStateList;
import android.content.res.Resources;
import android.graphics.Color;
import android.graphics.ColorMatrix;
import android.graphics.ColorMatrixColorFilter;
import android.graphics.drawable.Drawable;
import android.util.TypedValue;

import com.koushikdutta.boilerplate.R;

/**
 * Created by koush on 3/30/15.
 */
public class TintHelper {
    public static int getTextColorPrimary(Context context) {
        return getStyledColor(context, android.R.attr.textColorPrimary);
    }

    public static int getTextColorPrimaryInverse(Context context) {
        return getStyledColor(context, android.R.attr.textColorPrimaryInverse);
    }

    public static int getColorPrimaryDark(Context context) {
        return getStyledColor(context, R.attr.colorPrimaryDark);
    }

    public static int getColorPrimary(Context context) {
        return getStyledColor(context, R.attr.colorPrimary);
    }

    public static int getColorAccent(Context context) {
        return getStyledColor(context, R.attr.colorAccent);
    }

    public static int getStyledColor(Context context, int attr) {
        TypedValue typedValue = new TypedValue();
        Resources.Theme theme = context.getTheme();
        theme.resolveAttribute(attr, typedValue, true);
        return typedValue.data;
    }

    public static ColorStateList getTintColorStateList(Context context) {
        return getTintColorStateList(context, getTextColorPrimary(context));
    }

    public static ColorStateList getInverseTintColorStateList(Context context) {
        return getTintColorStateList(context, getTextColorPrimaryInverse(context));
    }

    public static ColorStateList getTintColorStateList(Context context, int textColorPrimary) {
        int colorPrimary = getColorPrimary(context);
        return getTintColorStateList(context, colorPrimary, textColorPrimary);
    }

    public static ColorStateList getTintColorStateList(Context context, int activeColor, int defaultColor) {
        return new ColorStateList(new int[][]{
        new int[]{android.R.attr.state_pressed},
        new int[]{android.R.attr.state_focused},
        new int[]{android.R.attr.state_selected},
        new int[]{android.R.attr.state_checked},
        new int[]{android.R.attr.state_active},
        new int[]{android.R.attr.state_activated},
        new int[]{}
        },
        new int[] {
        activeColor,
        activeColor,
        activeColor,
        activeColor,
        activeColor,
        activeColor,
        defaultColor
        });
    }

    //To generate negative image
    private static final  float[] colorMatrix_Negative = {
    -1.0f, 0, 0, 0, 255, //red
    0, -1.0f, 0, 0, 255, //green
    0, 0, -1.0f, 0, 255, //blue
    0, 0, 0, 1.0f, 0 //alpha
    };
    private static final ColorMatrix colorMatrixNegative = new ColorMatrix(colorMatrix_Negative);

    static void setColorFilter(Drawable drawable, int color) {
        ColorMatrix s = new ColorMatrix();
        s.setScale(1 - Color.red(color) / 255f, 1 - Color.green(color) / 255f, 1 - Color.blue(color) / 255f, 1);
        s.preConcat(colorMatrixNegative);
        s.postConcat(colorMatrixNegative);

        ColorMatrixColorFilter filter = new ColorMatrixColorFilter(s);
        drawable.setColorFilter(filter);
    }

    public static Drawable getStateListDrawable(Context context, Drawable drawable, int textColorPrimary) {
        if (drawable == null)
            return null;
        int colorPrimary = getColorPrimary(context);

        return getStateListDrawable(drawable, colorPrimary, textColorPrimary);
    }

    public static Drawable getColorMatrixStateListDrawable(Context context, Drawable drawable, int textColorPrimary) {
        if (drawable == null)
            return null;
        int colorPrimary = getColorPrimary(context);

        SelectorDrawable ret = getStateListDrawable(drawable, colorPrimary, textColorPrimary);
        ret.porterDuff = true;
        return ret;
    }

    private static SelectorDrawable getStateListDrawable(Drawable drawable, int colored, int normal) {
        drawable = drawable.getConstantState().newDrawable().mutate();
        SelectorDrawable ret = new SelectorDrawable();
        ret.colored = colored;
        ret.normal = normal;
        ret.addState(new int[]{android.R.attr.state_pressed}, drawable);
        ret.addState(new int[]{android.R.attr.state_focused}, drawable);
        ret.addState(new int[]{android.R.attr.state_selected}, drawable);
        ret.addState(new int[]{android.R.attr.state_checked}, drawable);
        ret.addState(new int[]{android.R.attr.state_active}, drawable);
        ret.addState(new int[]{android.R.attr.state_activated}, drawable);
        ret.addState(new int[]{}, drawable);

        return ret;
    }
}
