/*
 *  @author Ranides Atterwim <ranides@gmail.com>
 *  @copyright Ranides Atterwim
 *  @license WTFPL
 *  @url http://ranides.net/projects/assira
 */

package net.ranides.assira.awt;

import java.awt.Color;

/**
 * Popularne operacje na kolorach.
 * @author ranides
 */
public final class ColorUtils {

    private ColorUtils() { }

    /**
     * Zwraca kolor z odwrotnymi składowymi (z punktu widzenia RGB)
     * @param color
     * @return
     */
    public static Color invert(Color color) {
        int r = 255 - color.getRed();
        int g = 255 - color.getGreen();
        int b = 255 - color.getBlue();
        int a = color.getAlpha();
        return new Color(r,g,b,a);
    }
    
    /**
     * Zwraca kolor z przeźroczystością na podanym poziomie
     * @param color
     * @param alpha wartość kanału alpha [0-255]. Wartości spoza zakresu są przycinane.
     * @return
     */
    public static Color alpha(Color color, int alpha) {
        return new Color( (color.getRGB()&0x00FFFFFF)|(clip(alpha)<<24), true);
    }
    
    /**
     * Miesza dwa podane kolory w określonym stosunku.
     * @param back kolor tła
     * @param fore kolor pierwszo-planowy
     * @param progress stosunek łączenia kolorów. 0 oznacza {@code back}, 1.0 oznacza {@code fore}.
     * @return
     */
    public static Color merge(Color back, Color fore, double progress) {
        double p = clip(progress);
        double f = 1.0 - p;
        int r = round( back.getRed()*f + fore.getRed() * p);
        int g = round( back.getGreen()*f + fore.getGreen() * p);
        int b = round( back.getBlue()*f + fore.getBlue() * p);
        int a = round( back.getAlpha()*f + fore.getAlpha() * p);
        return new Color(r,g,b,a);
    }
    
    /**
     * Kopiuje podanych kolor.
     * @param color
     * @return
     */
    public static Color copy(Color color) {
        return new Color( color.getRGB() );
    }
    
    /**
     * Konwertuje kolor tekst z repreznacją szesnastkową, używaną np w CSS (t.j. #RRGGBB)
     * @param color
     * @return
     */
    public static String asHexString(Color color) {
        return String.format("#%06x", color.getRGB() & 0xFFFFFF );
    }
    
    public static Color fromHexString(String value) {
        if(7 != value.length()) {
            throw new IllegalArgumentException("Invalid color: " + value);
        }
        return new Color(Integer.parseInt(value.substring(1),16));
    }
    
    private static int clip(int value) {
        return value < 0 ? 0 : value > 255 ? 255 : value;
    }
    
    private static double clip(double value) {
        return value < 0.0 ? 0.0 : value > 1.0 ? 1.0 : value;
    }
    
    private static int round(double value) {
        return (int)( value < 0 ? 0 : (value > 255 ? 255 : value) );
    }

}
