#! /usr/bin/python3
"""Adaptation automatique d'un theme GTK"""

import glob
import re
from PIL import Image

#Les deux fonctions suivantes sont utilisés pour la substitution par REGEX
def repl(motif):
    """Adaptation des couleurs en hexadécimal"""
    #On récupère les trois couleurs en entier
    rouge = int(motif.group(1), 16)
    vert = int(motif.group(2), 16)
    bleu = int(motif.group(3), 16)
    if bleu >= 100 and rouge+vert <= 250:
        #Si le bleu est très présent par rapport aux autres couleurs, on
        #l'accentue davantage et on inverse rouge et bleu
        rouge = int(bleu*.5)
        return "#" + hex(rouge)[2:] + "0000"
    #Sinon on inverse seulement rouge et bleu
    return "#" + hex(bleu)[2:] + hex(vert)[2:] + hex(rouge)[2:]

def repl2(motif):
    """Adaptation des couleurs en décimal"""
    #On récupère les trois couleurs en entier
    rouge = int(motif.group(1), 10)
    vert = int(motif.group(2), 10)
    bleu = int(motif.group(3), 10)
    if bleu >= 100 and rouge+vert <= 250:
        #Si le bleu est très présent par rapport aux autres couleurs, on
        #l'accentue davantage et on inverse rouge et bleu
        rouge = int(bleu*.5)
        return "rgba(" + str(rouge) + ", 0, 0, "
    #Sinon on inverse seulement rouge et bleu
    return "rgba(" + str(bleu) + ", " + str(vert) + ", " + str(rouge) + ", "

#Pour les fichiers rc de GTK2
for fichier in glob.glob("**/*rc", recursive=True):
    lines = []
    with open(fichier) as fp:
        print(fichier)
        #Dans cahque ligne on cherche un code couleur en héxadécimal pour le
        #modifier
        for line in fp:
            line = re.sub(
                "#([0-f]{2})([0-f]{2})([0-f]{2})",
                repl,
                line
            )
            lines.append(line)
    #On réécrit le fichier avec les couleurs moddifiées
    with open(fichier, "w") as fp:
        fp.writelines(lines)

#Pour les fichiers css de GTK3
for fichier in glob.glob("**/*css", recursive=True):
    lines = []
    with open(fichier) as fp:
        print(fichier)
        #Dans cahque ligne on cherche un code couleur en héxadécimal ou en
        #décimal pour le modifier
        for line in fp:
            line = re.sub(
                "#([0-f]{2})([0-f]{2})([0-f]{2})",
                repl,
                line
            )
            line = re.sub(
                r"rgba\(([0-9]{1,3}), ([0-9]{1,3}), ([0-9]{1,3}), ",
                repl2,
                line
            )
            lines.append(line)
    #On réécrit le fichier avec les couleurs moddifiées
    with open(fichier, "w") as fp:
        fp.writelines(lines)

#Pour les fichiers png GTK2 et GTK3
for fichier in glob.glob("**/*png", recursive=True):
    print(fichier)
    im = Image.open(fichier)
    #On décompose l'image par canaux et pixel
    rgb_im = im.convert('RGBA')
    px = rgb_im.load()
    #On récupère la taille de l'image
    width, height = im.size
    for l in range(width):
        for h in range(height):
            #On récupère les trois couleurs en entier
            r, v, b, a = px[l, h]
            if b >= 100 and r+v <= 250:
                #Si le bleu est très présent par rapport aux autres couleurs, on
                #l'accentue davantage et on inverse rouge et bleu
                px[l, h] = (int(b*.5), 0, 0, a)
            else:
                #Sinon on inverse seulement rouge et bleu
                px[l, h] = (b, v, r, a)
    #On réécrit le fichier avec les couleurs moddifiées
    rgb_im.save(fichier)
