#!/usr/bin/env python3
"""FARBTON UND HELLIGKEIT jeder Flaeche der Leiste gegen die Sollwerte
aus lib/browser/chrome.fi.

Warum nicht nur die haeufigste Farbe: die haeufigste ist das
ADRESSFELD, nicht die Leiste -- ein Vergleich "haeufigste gegen bar"
meldet deshalb eine Abweichung, wo keine ist. Geprueft wird jede
Sollfarbe EINZELN: kommt sie im Bild vor, und mit welcher Abweichung?

Warum Farbton UND Helligkeit: RGB(59,41,30) und RGB(30,41,59) haben
dieselbe Helligkeit und sind zwei verschiedene Farben. Bei OrientOS
hat genau das eine Vertauschung von Rot und Blau durchgelassen.
"""
import sys, collections
sys.path.insert(0,'/tmp/fp')
from xwdmess import leser

SOLL_HELL = {
 'bar':'F9F9FB','page':'FFFFFF','sep':'D7D7DB','feld':'EDEDF0',
 'feld_fokus':'FFFFFF','akzent':'0060DF','hover':'DFDFE2',
 'fg':'15141B','fg_dim':'5B5B66','err':'C50042',
}
SOLL_DUNKEL = {
 'bar':'2B2A33','page':'1C1B22','sep':'3A3944','feld':'42414D',
 'feld_fokus':'1C1B22','akzent':'0A84FF','hover':'52525E',
 'fg':'FBFBFE','fg_dim':'8F8F9D','err':'FF5C5C',
}

pfad = sys.argv[1]
satz = SOLL_DUNKEL if sys.argv[2]=='dark' else SOLL_HELL
CH   = int(sys.argv[3]) if len(sys.argv)>3 else 44
w,h,px = leser(pfad)
z = collections.Counter()
for y in range(min(CH,h)):
    for x in range(w):
        z[px(x,y)] += 1
ges = sum(z.values())
print("== %s (%s) ==" % (pfad.split('/')[-1], sys.argv[2]))
fehler = 0
for name, hx in sorted(satz.items()):
    sr,sg,sb = int(hx[0:2],16),int(hx[2:4],16),int(hx[4:6],16)
    n = z.get((sr,sg,sb), 0)
    if n > 0:
        print("  %-11s #%s  EXAKT vorhanden, %6d Punkte (%.2f %%)"
              % (name, hx, n, 100.0*n/ges))
        continue
    # nicht exakt da: gibt es die VERTAUSCHUNG?
    nd = z.get((sb,sg,sr), 0)
    if nd > 0 and sr != sb:
        print("  %-11s #%s  !!! ROT UND BLAU VERTAUSCHT (%d Punkte)"
              % (name, hx, nd))
        fehler += 1
        continue
    # naechstliegende Farbe im Bild
    best, bd = None, 10**9
    for c,k in z.items():
        d = abs(c[0]-sr)+abs(c[1]-sg)+abs(c[2]-sb)
        if d < bd: best, bd = c, d
    if bd <= 3:
        print("  %-11s #%s  gleich bis auf Rundung (%s, Abstand %d)"
              % (name, hx, best, bd))
    else:
        print("  %-11s #%s  nicht im Bild (naechste %s, Abstand %d)"
              % (name, hx, best, bd))
print("  ---")
print("  %d Kanalvertauschungen" % fehler)
sys.exit(1 if fehler else 0)
