#ifndef IOMANIP_H_
#define IOMANIP_H_

#include <iostream>

namespace sc {
    namespace io {
        bool isatty_ostream(const std::ostream& out);

        std::ostream& hide_cursor(std::ostream& out);
        std::ostream& show_cursor(std::ostream& out);

        std::ostream& reset(std::ostream& out);

        std::ostream& bold(std::ostream& out);
        std::ostream& italic(std::ostream& out);
        std::ostream& underline(std::ostream& out);
        std::ostream& overline(std::ostream& out);
        std::ostream& strikethru(std::ostream& out);
        std::ostream& blinkslow(std::ostream& out);
        std::ostream& blinkfast(std::ostream& out);
        std::ostream& reverse(std::ostream& out);

        std::ostream& blackf(std::ostream& out);
        std::ostream& redf(std::ostream& out);
        std::ostream& greenf(std::ostream& out);
        std::ostream& yellowf(std::ostream& out);
        std::ostream& bluef(std::ostream& out);
        std::ostream& magentaf(std::ostream& out);
        std::ostream& cyanf(std::ostream& out);
        std::ostream& whitef(std::ostream& out);
        std::ostream& defaultf(std::ostream& out);

        std::ostream& blackb(std::ostream& out);
        std::ostream& redb(std::ostream& out);
        std::ostream& greenb(std::ostream& out);
        std::ostream& yellowb(std::ostream& out);
        std::ostream& blueb(std::ostream& out);
        std::ostream& magentab(std::ostream& out);
        std::ostream& cyanb(std::ostream& out);
        std::ostream& whiteb(std::ostream& out);
        std::ostream& defaultb(std::ostream& out);

        class grayf {
            int _val;

            public:
                grayf(int val);
                friend std::ostream& operator<<(std::ostream& out, const grayf& obj);
        };

        class grayb {
            int _val;

            public:
                grayb(int val);
                friend std::ostream& operator<<(std::ostream& out, const grayb& obj);
        };

        class rgbf {
            int _r;
            int _g;
            int _b;

            public:
                rgbf(int r, int g, int b);
                friend std::ostream& operator<<(std::ostream& out, const rgbf& obj);
        };

        class rgbb {
            int _r;
            int _g;
            int _b;

            public:
                rgbb(int r, int g, int b);
                friend std::ostream& operator<<(std::ostream& out, const rgbb& obj);
        };
    }
}

#endif // IOMANIP_H_