/***************************************************************************
                          stylecolour.h  -  description
                             -------------------
    begin                : Die Nov 5 2002
    copyright            : (C) 2002-2023 by Andre Simon
    email                : a.simon@mailbox.org
 ***************************************************************************/


/*
This file is part of Highlight.

Highlight is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

Highlight 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 General Public License for more details.

You should have received a copy of the GNU General Public License
along with Highlight.  If not, see <http://www.gnu.org/licenses/>.
*/


#ifndef STYLECOLOUR_H
#define STYLECOLOUR_H

#include "enums.h"

#include <string>


namespace highlight
{

/**\brief Stores colours and returns red, green and blue values in different formats
* @author Andre Simon
 */

struct RGBVal {
    int iRed,    ///< Red value
        iGreen,  ///< Green value
        iBlue;   ///< Blue value
};

class Colour
{
public:
    /** Constructor
        \param red Red value in hex notation
        \param green Blue value in hex notation
        \param blue Green value in hex notation
    */
    Colour ( const std::string & red, const std::string & green, const std::string & blue );

    /** Constructor
        \param ColourString String with rgb values
    */
    Colour ( const std::string & colourString );

    Colour();
    ~Colour() {};

    /** Sets red, green and blue values
      \param ColourString String containing colour attributes
    */
    void setRGB ( const std::string & colourString );

    /** Sets red value
        \param red New red value */
    void setRed ( const std::string & red );

    /** Sets green value
        \param green New green value */
    void setGreen ( const std::string & green );

    /** Sets blue value
        \param blue New blue value */
    void setBlue ( const std::string & blue );

    /**  @param type Output type
         @return Red value in color representation according to output type */
    std::string getRed ( OutputType type ) const;

    /**  @param type Output type
         @return Green value in color representation according to output type */
    std::string getGreen ( OutputType type ) const;

    /**  @param type Output type
         @return Blue value in color representation according to output type */
    std::string getBlue ( OutputType type ) const;

    /**  @return red value */
    int getRed () const;

    /**  @return green value */
    int getGreen () const;

    /**  @return blue value */
    int getBlue () const;

private:
    RGBVal rgb;
    std::string int2str ( int, std::ios_base& ( *f ) ( std::ios_base& ) ) const;
    std::string float2str ( double ) const;
};

}

#endif
