import colorama
colorama.init()

from colorama import Fore

def печать(
        текст,
        красный=False,
        оранжевый=False,
        жёлтый=False,
        зелёный=False,
        голубой=False,
        синий=False,
        фиолетовый=False,
        стиль=None,
        не_печатать=False
):

    def определить_стиль(стиль):

        if not стиль:
            return ""
        СТИЛИ = {
            "ж" : 1, # жирный
            "к" : 3, # курсивный
            "ч" : 4, # подчёркнутый
            "з" : 9, # зачёркнутый
        }

        # при комбинирование жирного и зачёркнутого должен получится результат
        # ;1;9
        # курсивный и подчеркнутый - ;3;4
        # жирный и курсивный - ;1;3

        накопитеьная = ""
        for буква in стиль:
            СТИЛИ.get(буква)
            код_стиля = СТИЛИ.get(буква)
            этот_стиль = f";{код_стиля}"
            накопитеьная += этот_стиль
        return "\x1B[" + накопитеьная[1:] + "m"

    # определенные символы в начале и в конце написаны на C++ и отвечают за кодировку цвета

    # первая часть строки задаёт стиль цвета и формата
    # \x1B[  специальный набор символов который включает этот режим настройки
    # 255;0;0; - цвет в формате RGB
    # 4 - подчеркнутый стиль шрифта
    # m - завершает настройку шрифта

    # последняя часть строки сбрасывает стиль в стандарт чтобы всё да
    # результат = "\x1B[38;2;255;0;0;4m" + текст + "\x1B[0m"

    готовый_стиль = определить_стиль(стиль)

    if красный:
        цвет = colorama.Fore.RED
    elif оранжевый:
        цвет = "255;100;0"
    elif жёлтый:
        цвет = colorama.Fore.YELLOW
    elif зелёный:
        цвет = colorama.Fore.GREEN
    elif голубой:
        цвет = colorama.Fore.CYAN
    elif синий:
        цвет = colorama.Fore.BLUE
    elif фиолетовый:
        цвет = colorama.Fore.MAGENTA
    else:
        цвет = "255;255;255"

    if цвет[-1] == "m":
        результат = f"{цвет}{готовый_стиль}{текст}\x1B[0m"
    else:
        результат = f"\x1B[38;2;{цвет}m{готовый_стиль}{текст}\x1B[0m"

    if не_печатать:
        return результат
    print(результат)

# Если оставить строки с запуском этих функций внутри файла с модулем то они будут выполнены в момент ИМПОРТА этого модуля.
# Чтобы этого не допустить но при этом оставить возможность тестировать этот файл модуля "прямо здесь" например чтобы провести отладку надо эти строки убрать внутрь блока если который будет проверять откуда закончить файл

# ЕСЛИ запуск произошел из этого файла (если он не импортируется)
if __name__ == "__main__":
    печать("Привет", зелёный=True)
    печать("Привет", оранжевый=True)
    печать("Привет", фиолетовый=True)
    печать("Привет", синий=True)
    
    print( )

    красный = печать("Каждый", красный=True, не_печатать=True)
    оранжевый = печать("охотник", оранжевый=True, не_печатать=True)
    жёлтый = печать("желает", жёлтый=True, не_печатать=True)
    зелёный = печать("знать", зелёный=True, не_печатать=True)
    голубой = печать("где", голубой=True, не_печатать=True)
    синий = печать("сидит", синий=True, не_печатать=True)
    фиолетовый = печать("фазан", фиолетовый=True, не_печатать=True)
    разноцветная_строка = f"{красный} {оранжевый} {жёлтый} {зелёный} {голубой} {синий} {фиолетовый}"
    print(разноцветная_строка)

    печать("красный (колорама)", красный=True, стиль="жч")
    печать("оранжевый (свой цвет)", оранжевый=True, стиль="жч")
