#!/usr/bin/env python

import os
import sys
from functools import lru_cache

if __name__ == '__main__' and not __package__:
    import __main__
    __main__.__package__ = 'gen'
    sys.path.insert(0, os.path.dirname(os.path.dirname(os.path.abspath(__file__))))


def to_linear(a: float) -> float:
    if a <= 0.04045:
        return a / 12.92
    else:
        return float(pow((a + 0.055) / 1.055, 2.4))


@lru_cache
def generate_srgb_lut(line_prefix: str = '    ') -> list[str]:
    values: list[str] = []
    lines: list[str] = []

    for i in range(256):
        values.append(f'{to_linear(i / 255.0):1.8f}f')

    for i in range(16):
        lines.append(line_prefix + ', '.join(values[i * 16:(i + 1) * 16]) + ',')

    lines[-1] = lines[-1].rstrip(',')
    return lines


def generate_srgb_gamma(declaration: str = 'static const GLfloat srgb_lut[256] = {', close: str = '};') -> str:
    lines: list[str] = []
    a = lines.append

    a('// Generated by gen-srgb-lut.py DO NOT edit')
    a('')
    a(declaration)
    lines += generate_srgb_lut()
    a(close)

    return "\n".join(lines)


def main(args: list[str]=sys.argv) -> None:
    c = generate_srgb_gamma()
    with open(os.path.join('kitty', 'srgb_gamma.h'), 'w') as f:
        f.write(f'{c}\n')


if __name__ == '__main__':
    import runpy
    m = runpy.run_path(os.path.dirname(os.path.abspath(__file__)))
    m['main']([sys.executable, 'srgb-lut'])
