import os
import shutil
import re
import subprocess

# 1. Restore pristine bak2
shutil.copyfile("src/Data/dmg_Main.dfm.bak2", "src/Data/dmg_Main.dfm")
shutil.copyfile("src/UI/frm_Main.dfm.bak2", "src/UI/frm_Main.dfm")

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

NEW_ICONS = [
    # Producción (14)
    "icon_prod_calendario",
    "icon_prod_obradores",
    "icon_prod_almacenes",
    "icon_prod_familias",
    "icon_prod_materias_primas",
    "icon_prod_recetas",
    "icon_prod_lotes",
    "icon_prod_alergenos",
    "icon_prod_asignar_mp",
    "icon_prod_inventarios",
    "icon_prod_incidencias",
    "icon_prod_formatos_presentacion",
    "icon_prod_formatos_envio",
    "icon_prod_stock_envasado",
    # Empresa (6)
    "icon_emp_empresas",
    "icon_emp_selec_emp",
    "icon_emp_series",
    "icon_emp_tipos_iva",
    "icon_emp_config",
    "icon_emp_formas_pago"
]

BUTTON_MAPPING = {
    # Empresa
    "btnEmpresasRibbon": "icon_emp_empresas",
    "btnCambiarEmpresa": "icon_emp_selec_emp",
    "btnSeries": "icon_emp_series",
    "btnConfigConexion": "icon_emp_config",
    "btnTiposIva": "icon_emp_tipos_iva",
    "btnFormasPago": "icon_emp_formas_pago",
    # Producción
    "btnCalendarioProduccion": "icon_prod_calendario",
    "btnObradores": "icon_prod_obradores",
    "btnAlmacenes": "icon_prod_almacenes",
    "btnFamilias": "icon_prod_familias",
    "btnMateriasPrimas": "icon_prod_materias_primas",
    "btnRecetas": "icon_prod_recetas",
    "btnLotesRibbon": "icon_prod_lotes",
    "btnAlergenos": "icon_prod_alergenos",
    "btnAsignarMateriasPrimas": "icon_prod_asignar_mp",
    "btnInventariosRibbon": "icon_prod_inventarios",
    "btnIncidencias": "icon_prod_incidencias",
    "btnFormatosPresentacion": "icon_prod_formatos_presentacion",
    "btnFormatosEnvio": "icon_prod_formatos_envio",
    "btnStockEnvasado": "icon_prod_stock_envasado"
}

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)

# --- 2. Inject into imgCollection ---
# In imgCollection, the last item ends with `          end>\n      end>\n    Left = 120`
col_marker = "\n          end>\n      end>\n    Left = 120\n    Top = 264\n  end\n  object imgListRibbon: TVirtualImageList"
col_pos = dmg_dfm.find(col_marker)
if col_pos == -1:
    raise Exception("col_marker not found!")

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

# Replace the previous last `      end>` with `      end`, and then add our items ending with `end>`
replacement_col = "\n          end>\n      end\n" + "\n".join(col_items) + "\n    Left = 120\n    Top = 264\n  end\n  object imgListRibbon: TVirtualImageList"
dmg_dfm = dmg_dfm[:col_pos] + replacement_col + dmg_dfm[col_pos + len(col_marker):]

# --- 3. Inject into imgListRibbon ---
rib_marker = "\n      end>\n    ImageCollection = imgCollection"
rib_pos = dmg_dfm.find(rib_marker)
if rib_pos == -1:
    raise Exception("rib_marker not found!")

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

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

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

print("dmg_Main.dfm rewritten with correct syntax.")

# 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)
print("convert.exe STDOUT:", res.stdout.strip())
if os.path.exists(r"src\Data\dmg_Main.txt"):
    os.remove(r"src\Data\dmg_Main.txt")
    print("convert.exe parsed dmg_Main.dfm with ZERO errors!")

# --- 4. Now update frm_Main.dfm with accurate ImageIndex and ImageName ---
with open("src/Data/dmg_Main.dfm", "r", encoding="latin-1") as f:
    dmg_text = f.read()

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

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

print(f"Total items in imgListRibbon: {len(item_names)}")

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

for btn_name, icon_name in BUTTON_MAPPING.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 not match:
        print(f"Warning: {btn_name} not found!")
        continue
    
    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)

print("frm_Main.dfm updated successfully!")
