/* class Color
 *
 * Copyright (C) 2001  R M Pitman
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 */

package charva.awt;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * A class used to represent the color values available on a text terminal.
 */
public class Color {

    private static final Log LOG = LogFactory.getLog(Color.class);
    /**
     * Construct a Color from the specified RGB values. Each value must
     * be in the range 0-255.
     */
    public Color(int red_, int green_, int blue_) {
        _red = (red_ != 0) ? 255 : 0;
        _green = (green_ != 0) ? 255 : 0;
        _blue = (blue_ != 0) ? 255 : 0;
    }

    public boolean equals(Object obj_) {
        if (obj_ == null)
            return false;

        if (!(obj_ instanceof Color))
            return false;

        Color othercolor = (Color) obj_;
        if (_red != othercolor._red)
            return false;
        if (_green != othercolor._green)
            return false;
        if (_blue != othercolor._blue)
            return false;

        return true;
    }

    /**
     * Convert the Color object to an integer value compatible with
     * the ncurses library.
     */
    public int getCursesColor() {
        if (_red != 0) {
            if (_green != 0) {
                if (_blue != 0)
                    return Toolkit.WHITE;
                else
                    return Toolkit.YELLOW;
            } else {
                if (_blue != 0)
                    return Toolkit.MAGENTA;
                else
                    return Toolkit.RED;
            }
        } else {
            if (_green != 0) {
                if (_blue != 0)
                    return Toolkit.CYAN;
                else
                    return Toolkit.GREEN;
            } else {
                if (_blue != 0)
                    return Toolkit.BLUE;
                else
                    return Toolkit.BLACK;
            }
        }
    }

    public String toString() {
        if (_red != 0) {
            if (_green != 0) {
                if (_blue != 0)
                    return "white";
                else
                    return "cyan";
            } else {
                if (_blue != 0)
                    return "magenta";
                else
                    return "red";
            }
        } else {
            if (_green != 0) {
                if (_blue != 0)
                    return "white";
                else
                    return "green";
            } else {
                if (_blue != 0)
                    return "blue";
                else
                    return "black";
            }
        }
    }

    /**
     * Compute the ncurses color-pair number corresponding to the specified
     * foreground and background color.
     */
    public static int getCursesColor(Color foreground_, Color background_) {
        if (!Toolkit.isColorEnabled)
            return 0;

        /* The default colors (in case an exception occurs) are white
         * on black.
         */
        int curses_color_pair = 0;
        try {
            Toolkit toolkit = Toolkit.getDefaultToolkit();

            // if the terminal is capable of colors
            if (toolkit.hasColors()) {
                ColorPair color_pair = new ColorPair(foreground_, background_);
                curses_color_pair = toolkit.getColorPairIndex(color_pair);
            }
        } catch (TerminfoCapabilityException e) {
            LOG.warn("can't set color pair: foreground " +
                    foreground_ + " background " + background_);
        }
        return curses_color_pair;
    }


    /**
     * Convert an ncurses color value to a color name.
     */
    public static String getColorName(int colorval_) {
        if (colorval_ == Toolkit.BLACK)
            return "black";
        else if (colorval_ == Toolkit.RED)
            return "red";
        else if (colorval_ == Toolkit.GREEN)
            return "green";
        else if (colorval_ == Toolkit.YELLOW)
            return "yellow";
        else if (colorval_ == Toolkit.BLUE)
            return "blue";
        else if (colorval_ == Toolkit.MAGENTA)
            return "magenta";
        else if (colorval_ == Toolkit.CYAN)
            return "cyan";
        else if (colorval_ == Toolkit.WHITE)
            return "white";
        else
            return "UNKNOWN";
    }

    /**
     * Convert from an integer (ncurses-compatible) value to
     * a Color object.
     */
    public static Color fromCursesColor(int colorval_) {
        if (colorval_ == Toolkit.BLACK)
            return black;
        else if (colorval_ == Toolkit.RED)
            return red;
        else if (colorval_ == Toolkit.GREEN)
            return green;
        else if (colorval_ == Toolkit.YELLOW)
            return yellow;
        else if (colorval_ == Toolkit.BLUE)
            return blue;
        else if (colorval_ == Toolkit.MAGENTA)
            return magenta;
        else if (colorval_ == Toolkit.CYAN)
            return cyan;
        else if (colorval_ == Toolkit.WHITE)
            return white;
        else
            return null;
    }

    //====================================================================
    // INSTANCE VARIABLES
    private int _red;
    private int _green;
    private int _blue;

    public static final Color black = new Color(0, 0, 0);
    public static final Color red = new Color(255, 0, 0);
    public static final Color green = new Color(0, 255, 0);
    public static final Color yellow = new Color(255, 255, 0);
    public static final Color blue = new Color(0, 0, 255);
    public static final Color magenta = new Color(255, 0, 255);
    public static final Color cyan = new Color(0, 255, 255);
    public static final Color white = new Color(255, 255, 255);

}
