import sys
import numpy as np
from osgeo import gdal
import os

def generate_color_txt(tif_path, color_min, color_max, output_txt=None):
    # Parse colors
    r_min, g_min, b_min = map(int, color_min.split(','))
    r_max, g_max, b_max = map(int, color_max.split(','))

    # Open TIFF
    ds = gdal.Open(tif_path)
    if ds is None:
        print(f"Erro: Não foi possível abrir o arquivo: {tif_path}")
        return

    band = ds.GetRasterBand(1)
    arr = band.ReadAsArray().astype(float)
    arr = arr[arr >= 0]  # Remove NoData

    if len(arr) == 0:
        print("Erro: Nenhum dado válido encontrado no TIFF.")
        return

    # Quantis
    percentiles = [0, 5, 10, 15, 20, 25, 30, 35, 40, 45, 50,
                    55, 60, 65, 70, 75, 80, 85, 90, 95, 99, 100]
    quantis = np.percentile(arr, percentiles)

    # Output file
    if output_txt is None:
        output_txt = os.path.splitext(tif_path)[0] + '_color.txt'
    
    with open(output_txt, 'w') as f:
        f.write('nv 0 0 0 0\n')
        n = len(quantis)
        for i, q in enumerate(quantis):
            # Interpola linearmente entre min e max
            factor = i / (n - 1)
            r = int(r_min + factor * (r_max - r_min))
            g = int(g_min + factor * (g_max - g_min))
            b = int(b_min + factor * (b_max - b_min))
            f.write(f'{q:.4f} {r} {g} {b} 255\n')
    
    print(f"Arquivo gerado: {output_txt}")
    print(f"   Faixa: {arr.min():.3f} → {arr.max():.3f} m")
    print(f"   Cores: ({r_min},{g_min},{b_min}) → ({r_max},{g_max},{b_max})")

if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Uso:")
        print("  python generate_color_relief.py <caminho_tif> <Rmin,Gmin,Bmin> <Rmax,Gmax,Bmax>")
        print("")
        print("Exemplo:")
        print("  python generate_color_relief.py alt_onda_smooth.tif 0,0,50 255,255,255")
        sys.exit(1)

    tif_path = sys.argv[1]
    color_min = sys.argv[2]
    color_max = sys.argv[3]

    generate_color_txt(tif_path, color_min, color_max)
