import os
import re
import subprocess

NEW_3 = ["icon_asistente_ia", "icon_empresa_corp", "icon_series_facturacion"]

def format_png_to_dfm_data(png_path):
    with open(png_path, "rb") as f:
        b = f.read()
    hex_str = b.hex().upper()
    lines = []
    for i in range(0, len(hex_str), 66):
        lines.append("              " + hex_str[i:i+66])
    return "\n".join(lines)

with open("src/Data/dmg_Main.dfm", "r", encoding="latin-1") as f:
    dmg_text = f.read()

# 1. Add to imgCollection
col_marker = "\n          end>\n      end>\n    Left = 120\n    Top = 264\n  end\n  object imgListRibbon: TVirtualImageList"
col_pos = dmg_text.find(col_marker)
if col_pos == -1:
    raise Exception("col_marker not found in dmg_Main.dfm")

col_items = []
for i, name in enumerate(NEW_3):
    png_path = os.path.join("resources/iconos_secciones", f"{name}.png")
    hex_data = format_png_to_dfm_data(png_path)
    is_last = (i == len(NEW_3) - 1)
    end_tag = "      end>" if is_last else "      end"
    item_str = f"""      item
        Name = '{name}'
        SourceImages = <
          item
            Image.Data = {{
{hex_data}
            }}
          end>
{end_tag}"""
    col_items.append(item_str)

replacement_col = "\n          end>\n      end\n" + "\n".join(col_items) + "\n    Left = 120\n    Top = 264\n  end\n  object imgListRibbon: TVirtualImageList"
dmg_text = dmg_text[:col_pos] + replacement_col + dmg_text[col_pos + len(col_marker):]

# 2. Add to imgListRibbon
rib_marker = "\n      end>\n    ImageCollection = imgCollection"
rib_pos = dmg_text.find(rib_marker)
if rib_pos == -1:
    raise Exception("rib_marker not found in dmg_Main.dfm")

rib_items = []
for i, name in enumerate(NEW_3):
    is_last = (i == len(NEW_3) - 1)
    end_tag = "      end>" if is_last else "      end"
    item_str = f"""      item
        CollectionName = '{name}'
        Name = '{name}'
{end_tag}"""
    rib_items.append(item_str)

replacement_rib = "\n      end\n" + "\n".join(rib_items) + "\n    ImageCollection = imgCollection"
dmg_text = dmg_text[:rib_pos] + replacement_rib + dmg_text[rib_pos + len(rib_marker):]

with open("src/Data/dmg_Main.dfm", "w", encoding="latin-1") as f:
    f.write(dmg_text)

print("dmg_Main.dfm updated with the 3 icons.")

# Validate with convert.exe
convert_exe = r"C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\convert.exe"
res = subprocess.run([convert_exe, "-t", r"src\Data\dmg_Main.dfm"], capture_output=True, text=True)
if os.path.exists(r"src\Data\dmg_Main.txt"):
    os.remove(r"src\Data\dmg_Main.txt")
    print("convert.exe verified dmg_Main.dfm syntax successfully!")

# Map in frm_Main.dfm
with open("src/Data/dmg_Main.dfm", "r", encoding="latin-1") as f:
    dmg_updated = f.read()

rib_start = dmg_updated.find("object imgListRibbon: TVirtualImageList")
rib_end = dmg_updated.find("ImageCollection = imgCollection", rib_start)
rib_section = dmg_updated[rib_start:rib_end]

item_names = re.findall(r"CollectionName = \'([^\']+)\'", rib_section)
name_to_index = {name: idx for idx, name in enumerate(item_names)}

with open("src/UI/frm_Main.dfm", "r", encoding="latin-1") as f:
    frm_dfm = f.read()

UPDATES = {
    "btnChatIA": "icon_asistente_ia",
    "btnEmpresasRibbon": "icon_empresa_corp",
    "btnSeries": "icon_series_facturacion",
}

for btn_name, icon_name in UPDATES.items():
    idx = name_to_index[icon_name]
    btn_pattern = rf"(object {btn_name}: TSpeedButton.*?)(end\b)"
    match = re.search(btn_pattern, frm_dfm, re.DOTALL)
    if match:
        body = match.group(1)
        body = re.sub(r"\s*ImageIndex\s*=\s*-?\d+\r?\n", "\n", body)
        body = re.sub(r"\s*ImageName\s*=\s*[^\r\n]+\r?\n", "\n", body)
        insertion = f"\n          ImageIndex = {idx}\n          ImageName = '{icon_name}'"
        body = body.replace("Images = dmgMain.imgListRibbon", f"Images = dmgMain.imgListRibbon{insertion}")
        frm_dfm = frm_dfm[:match.start()] + body + match.group(2) + frm_dfm[match.end():]
        print(f"Updated {btn_name}: ImageIndex={idx}, ImageName={icon_name}")

with open("src/UI/frm_Main.dfm", "w", encoding="latin-1") as f:
    f.write(frm_dfm)

res = subprocess.run([convert_exe, "-t", r"src\UI\frm_Main.dfm"], capture_output=True, text=True)
if os.path.exists(r"src\UI\frm_Main.txt"):
    os.remove(r"src\UI\frm_Main.txt")
    print("convert.exe verified frm_Main.dfm syntax successfully!")
