/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */

#ifndef GUAC_TERMINAL_PALETTE_H
#define GUAC_TERMINAL_PALETTE_H

#include "config.h"

#include <stdint.h>

/**
 * The pseudo-index of the color set as the the default foreground color for
 * the terminal. Regardless of what changes are made to the palette, this index
 * will always return the current default foreground color.
 */
#define GUAC_TERMINAL_COLOR_FOREGROUND -2

/**
 * The pseudo-index of the color set as the the default background color for
 * the terminal. Regardless of what changes are made to the palette, this index
 * will always return the current default background color.
 */
#define GUAC_TERMINAL_COLOR_BACKGROUND -3

/**
 * The index of black within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_BLACK 0

/**
 * The index of low-intensity red within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_DARK_RED 1

/**
 * The index of low-intensity green within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_DARK_GREEN 2

/**
 * The index of brown within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_BROWN 3

/**
 * The index of low-intensity blue within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_DARK_BLUE 4

/**
 * The index of low-intensity magenta (purple) within the terminal color
 * palette.
 */
#define GUAC_TERMINAL_COLOR_PURPLE 5

/**
 * The index of low-intensity cyan (teal) within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_TEAL 6

/**
 * The index of low-intensity white (gray) within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_GRAY 7

/**
 * The index of bright black (dark gray) within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_DARK_GRAY 8

/**
 * The index of bright red within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_RED 9

/**
 * The index of bright green within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_GREEN 10

/**
 * The index of bright brown (yellow) within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_YELLOW 11

/**
 * The index of bright blue within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_BLUE 12

/**
 * The index of bright magenta within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_MAGENTA 13

/**
 * The index of bright cyan within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_CYAN 14

/**
 * The index of bright white within the terminal color palette.
 */
#define GUAC_TERMINAL_COLOR_WHITE 15

/**
 * The index of the first low-intensity color in the 16-color portion of the
 * palette.
 */
#define GUAC_TERMINAL_FIRST_DARK 0

/**
 * The index of the last low-intensity color in the 16-color portion of the
 * palette.
 */
#define GUAC_TERMINAL_LAST_DARK 7

/**
 * The index of the first high-intensity color in the 16-color portion of the
 * palette.
 */
#define GUAC_TERMINAL_FIRST_INTENSE 8

/**
 * The index of the last high-intensity color in the 16-color portion of the
 * palette.
 */
#define GUAC_TERMINAL_LAST_INTENSE 15

/**
 * The distance between the palette indices of the dark colors (0 through 7)
 * and the bright colors (8 - 15) in the 16-color portion of the palette.
 */
#define GUAC_TERMINAL_INTENSE_OFFSET 8

/**
 * An RGB color, where each component ranges from 0 to 255.
 */
typedef struct guac_terminal_color {

    /**
     * The index of this color within the terminal palette, or -1 if the color
     * does not exist within the terminal palette.
     */
    int palette_index;

    /**
     * The red component of this color.
     */
    uint8_t red;

    /**
     * The green component of this color.
     */
    uint8_t green;

    /**
     * The blue component of this color.
     */
    uint8_t blue;

} guac_terminal_color;

/**
 * Compares two colors, returning a negative value if the first color is less
 * than the second, a positive value if the first color is greater than the
 * second, and zero if the colors are identical. Only the color components are
 * compared (not the palette index). The red component is considered the
 * highest order component, followed by green, followed by blue.
 *
 * @param a
 *     The first color to compare.
 *
 * @param b
 *     The second color to compare.
 *
 * @return
 *    A negative value if the first color is less than the second, a positive
 *    value if the first color is greater than the second, and zero if the
 *    colors are identical.
 */
int guac_terminal_colorcmp(const guac_terminal_color* a,
        const guac_terminal_color* b);

/**
 * The initial state of the terminal color palette. The color palette used by
 * the terminal may modified after the terminal is created through console
 * codes.
 */
extern const guac_terminal_color GUAC_TERMINAL_INITIAL_PALETTE[256];

#endif

