"""Decode the favicon-maker browser downloads and write a per-layer CSV."""
import csv
import hashlib
from pathlib import Path
from PIL import Image

ROOT = Path(__file__).resolve().parent
INPUTS = ROOT / "inputs"
OUTPUTS = ROOT / "outputs"

def counts(image):
    rgba = image.convert("RGBA")
    alpha = rgba.getchannel("A")
    histogram = alpha.histogram()
    return histogram[0], sum(histogram[1:255]), histogram[255]

rows = []
for source in sorted(INPUTS.iterdir()):
    ext = source.suffix.lstrip(".")
    result = OUTPUTS / f"same-icon-{ext}.ico"
    with Image.open(source) as input_image:
        input_zero, input_partial, input_opaque = counts(input_image)
        input_size = f"{input_image.width}x{input_image.height}"
    output_bytes = result.stat().st_size
    output_hash = hashlib.sha256(result.read_bytes()).hexdigest()
    with Image.open(result) as ico:
        sizes = sorted(ico.ico.sizes(), key=lambda size: size[0])
        for size in sizes:
            frame = ico.ico.getimage(size)
            alpha_zero, alpha_partial, alpha_opaque = counts(frame)
            pixel_count = frame.width * frame.height
            rows.append([
                source.name, ext.upper(), input_size, source.stat().st_size,
                input_zero, input_partial, input_opaque,
                result.name, output_bytes, output_hash,
                f"{frame.width}x{frame.height}", alpha_zero, alpha_partial,
                alpha_opaque,
            ])

columns = [
    "input_file", "input_format", "input_dimensions", "input_bytes",
    "source_alpha_zero_pixels", "source_alpha_partial_pixels", "source_alpha_opaque_pixels",
    "output_file", "output_bytes", "output_sha256", "ico_layer",
    "layer_alpha_zero_pixels", "layer_alpha_partial_pixels", "layer_alpha_opaque_pixels",
]
with (ROOT / "measurements.csv").open("w", newline="", encoding="utf-8") as stream:
    writer = csv.writer(stream)
    writer.writerow(columns)
    writer.writerows(rows)

print("input_format,input_bytes,output_bytes,layers,output_sha256,source_alpha_zero,source_alpha_partial")
for source in sorted(INPUTS.iterdir()):
    ext = source.suffix.lstrip(".")
    result = OUTPUTS / f"same-icon-{ext}.ico"
    selected = [row for row in rows if row[0] == source.name]
    print(f"{ext.upper()},{source.stat().st_size},{result.stat().st_size},"
          f"{';'.join(row[10] for row in selected)},"
          f"{selected[0][9]},{selected[0][4]},{selected[0][5]}")
