/*
 * 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_DISPLAY_H
#define _GUAC_TERMINAL_DISPLAY_H

#include "config.h"

#include "common/surface.h"
#include "palette.h"
#include "types.h"

#include <guacamole/client.h>
#include <guacamole/layer.h>
#include <pango/pangocairo.h>

#include <stdbool.h>
#include <stdint.h>

/**
 * The maximum width of any character, in columns.
 */
#define GUAC_TERMINAL_MAX_CHAR_WIDTH 2

/**
 * All available terminal operations which affect character cells.
 */
typedef enum guac_terminal_operation_type {

    /**
     * Operation which does nothing.
     */
    GUAC_CHAR_NOP,

    /**
     * Operation which copies a character from a given row/column coordinate.
     */
    GUAC_CHAR_COPY,

    /**
     * Operation which sets the character and attributes.
     */
    GUAC_CHAR_SET

} guac_terminal_operation_type;

/**
 * A pairing of a guac_terminal_operation_type and all parameters required by
 * that operation type.
 */
typedef struct guac_terminal_operation {

    /**
     * The type of operation to perform.
     */
    guac_terminal_operation_type type;

    /**
     * The character (and attributes) to set the current location to. This is
     * only applicable to GUAC_CHAR_SET.
     */
    guac_terminal_char character;

    /**
     * The row to copy a character from. This is only applicable to
     * GUAC_CHAR_COPY.
     */
    int row;

    /**
     * The column to copy a character from. This is only applicable to
     * GUAC_CHAR_COPY.
     */
    int column;

} guac_terminal_operation;

/**
 * Set of all pending operations for the currently-visible screen area, and the
 * contextual information necessary to interpret and render those changes.
 */
typedef struct guac_terminal_display {

    /**
     * The Guacamole client this display will use for rendering.
     */
    guac_client* client;

    /**
     * Array of all operations pending for the visible screen area.
     */
    guac_terminal_operation* operations;

    /**
     * The width of the screen, in characters.
     */
    int width;

    /**
     * The height of the screen, in characters.
     */
    int height;

    /**
     * The description of the font to use for rendering.
     */
    PangoFontDescription* font_desc;

    /**
     * The width of each character, in pixels.
     */
    int char_width;

    /**
     * The height of each character, in pixels.
     */
    int char_height;

    /**
     * The current palette.
     */
    guac_terminal_color palette[256];

    /**
     * The default palette. Use GUAC_TERMINAL_INITIAL_PALETTE if null.
     * Must free on destruction if not null.
     */
    guac_terminal_color (*default_palette)[256];

    /**
     * Default foreground color for all glyphs.
     */
    guac_terminal_color default_foreground;

    /**
     * Default background color for all glyphs and the terminal itself.
     */
    guac_terminal_color default_background;

    /**
     * The foreground color to be used for the next glyph rendered to the
     * terminal.
     */
    guac_terminal_color glyph_foreground;

    /**
     * The background color to be used for the next glyph rendered to the
     * terminal.
     */
    guac_terminal_color glyph_background;

    /**
     * The surface containing the actual terminal.
     */
    guac_common_surface* display_surface;

    /**
     * Layer which contains the actual terminal.
     */
    guac_layer* display_layer;

    /**
     * Sub-layer of display layer which highlights selected text.
     */
    guac_layer* select_layer;

    /**
     * Whether text is currently selected.
     */
    bool text_selected;

    /**
     * The row that the selection starts at.
     */
    int selection_start_row;

    /**
     * The column that the selection starts at.
     */
    int selection_start_column;

    /**
     * The row that the selection ends at.
     */
    int selection_end_row;

    /**
     * The column that the selection ends at.
     */
    int selection_end_column;

} guac_terminal_display;

/**
 * Allocates a new display having the given default foreground and background
 * colors.
 */
guac_terminal_display* guac_terminal_display_alloc(guac_client* client,
        const char* font_name, int font_size, int dpi,
        guac_terminal_color* foreground, guac_terminal_color* background,
        guac_terminal_color (*palette)[256]);

/**
 * Frees the given display.
 */
void guac_terminal_display_free(guac_terminal_display* display);

/**
 * Resets the palette of the given display to the initial, default color
 * values, as defined by default_palette or GUAC_TERMINAL_INITIAL_PALETTE.
 *
 * @param display
 *     The display to reset.
 */
void guac_terminal_display_reset_palette(guac_terminal_display* display);

/**
 * Replaces the color in the palette at the given index with the given color.
 * If the index is invalid, the assignment is ignored.
 *
 * @param display
 *     The display whose palette is being changed.
 *
 * @param index
 *     The index of the palette entry to change.
 *
 * @param color
 *     The color to assign to the palette entry having the given index.
 *
 * @returns
 *     Zero if the assignment was successful, non-zero if the assignment
 *     failed.
 */
int guac_terminal_display_assign_color(guac_terminal_display* display,
        int index, const guac_terminal_color* color);

/**
 * Retrieves the color within the palette at the given index, if such a color
 * exists. If the index is invalid, no color is retrieved.
 *
 * @param display
 *     The display whose palette contains the color to be retrieved.
 *
 * @param index
 *     The index of the palette entry to retrieve.
 *
 * @param color
 *     A pointer to a guac_terminal_color structure which should receive the
 *     color retrieved from the palette.
 *
 * @returns
 *     Zero if the color was successfully retrieved, non-zero otherwise.
 */
int guac_terminal_display_lookup_color(guac_terminal_display* display,
        int index, guac_terminal_color* color);

/**
 * Copies the given range of columns to a new location, offset from
 * the original by the given number of columns.
 */
void guac_terminal_display_copy_columns(guac_terminal_display* display, int row,
        int start_column, int end_column, int offset);

/**
 * Copies the given range of rows to a new location, offset from the
 * original by the given number of rows.
 */
void guac_terminal_display_copy_rows(guac_terminal_display* display,
        int start_row, int end_row, int offset);

/**
 * Sets the given range of columns within the given row to the given
 * character.
 */
void guac_terminal_display_set_columns(guac_terminal_display* display, int row,
        int start_column, int end_column, guac_terminal_char* character);

/**
 * Resize the terminal to the given dimensions.
 */
void guac_terminal_display_resize(guac_terminal_display* display, int width, int height);

/**
 * Flushes all pending operations within the given guac_terminal_display.
 */
void guac_terminal_display_flush(guac_terminal_display* display);

/**
 * Initializes and syncs the current terminal display state for the given user
 * that has just joined the connection, sending the necessary instructions to
 * completely recreate and redraw the terminal rendering over the given socket.
 *
 * @param display
 *     The terminal display to sync to the given user.
 *
 * @param user
 *     The user that has just joined the connection.
 *
 * @param socket
 *     The socket over which any necessary instructions should be sent.
 */
void guac_terminal_display_dup(guac_terminal_display* display, guac_user* user,
        guac_socket* socket);

/**
 * Draws the text selection rectangle from the given coordinates to the given end coordinates.
 */
void guac_terminal_display_select(guac_terminal_display* display,
        int start_row, int start_col, int end_row, int end_col);

/**
 * Clears the currently-selected region, removing the highlight.
 *
 * @param display
 *     The guac_terminal_display whose currently-selected region should be
 *     cleared.
 */
void guac_terminal_display_clear_select(guac_terminal_display* display);

/**
 * Alters the font of the terminal display. The available display area and the
 * regular grid of character cells will be resized as necessary to compensate
 * for any changes in font metrics.
 *
 * If successful, the terminal itself MUST be manually resized to take into
 * account the new character dimensions, and MUST be manually redrawn. Failing
 * to do so will result in graphical artifacts.
 *
 * @param display
 *     The display whose font family and/or size are being changed.
 *
 * @param font_name
 *     The name of the new font family, or NULL if the font family should
 *     remain unchanged.
 *
 * @param font_size
 *     The new font size, in points, or -1 if the font size should remain
 *     unchanged.
 *
 * @param dpi
 *     The resolution of the display in DPI. If the font size will not be
 *     changed (the font size given is -1), this value is ignored.
 *
 * @return
 *     Zero if the font was successfully changed, non-zero otherwise.
 */
int guac_terminal_display_set_font(guac_terminal_display* display,
        const char* font_name, int font_size, int dpi);

#endif

