import os
import re
import subprocess

with open('src/Data/dmg_Main.dfm', 'r', encoding='latin1') as f:
    dmg_text = f.read()

rib_match = re.search(r'object imgListRibbon: TVirtualImageList(.*?)object qryAlbaranes:', dmg_text, re.DOTALL)
rib_items_all = re.findall(r'item\s+(.*?)end\b', rib_match.group(1), re.DOTALL)

rib_name_to_index = {}
for i, blk in enumerate(rib_items_all):
    name_m = re.search(r'Name = ([^\r\n]+)', blk)
    c_name_m = re.search(r'CollectionName = ([^\r\n]+)', blk)
    val = name_m.group(1).strip() if name_m else (c_name_m.group(1).strip() if c_name_m else None)
    if val:
        rib_name_to_index[val] = i
        if val.startswith("'") and val.endswith("'"):
            rib_name_to_index[val[1:-1]] = i

with open('src/UI/frm_Main.dfm', 'r', encoding='latin1') as f:
    frm_dfm = f.read()

def replacer(match):
    full_btn = match.group(0)
    btn_id = match.group(1)
    
    name_m = re.search(r'ImageName = ([^\r\n]+)', full_btn)
    if not name_m:
        return full_btn
    
    raw_name = name_m.group(1).strip()
    clean_name = raw_name[1:-1] if (raw_name.startswith("'") and raw_name.endswith("'")) else raw_name
    
    target_idx = rib_name_to_index.get(raw_name)
    if target_idx is None:
        target_idx = rib_name_to_index.get(clean_name)
    
    if target_idx is None:
        print(f"Warning: Could not find index for {btn_id} with ImageName {raw_name}")
        return full_btn
    
    # Remove existing ImageIndex and blank lines around it
    new_btn = re.sub(r'(\r?\n\s*)+ImageIndex = -?\d+', '', full_btn)
    # Ensure clean indentation of ImageIndex and ImageName
    new_btn = re.sub(r'(\r?\n\s*)ImageName = ([^\r\n]+)', rf'\1ImageIndex = {target_idx}\1ImageName = \2', new_btn)
    # Remove any duplicate empty lines
    new_btn = re.sub(r'(\r?\n\s*){2,}', r'\1', new_btn)
    return new_btn

pattern = re.compile(r'object (btn\w+): TSpeedButton.*?end\b', re.DOTALL)
updated_frm = pattern.sub(replacer, frm_dfm)

with open('src/UI/frm_Main.dfm', 'w', encoding='latin1') as f:
    f.write(updated_frm)

print("frm_Main.dfm updated with 100% synchronized ImageIndex!")

convert_exe = r'C:\Program Files (x86)\Embarcadero\Studio\22.0\bin\convert.exe'
res = subprocess.run([convert_exe, '-t', r'src\UI\frm_Main.dfm'], capture_output=True, text=True)
print('convert.exe frm_Main:', res.stdout.strip())
if os.path.exists('src/UI/frm_Main.txt'):
    os.remove('src/UI/frm_Main.txt')

with open('src/UI/frm_Main.dfm', 'r', encoding='latin1') as f:
    final_text = f.read()

mismatches = []
buttons = re.findall(r'object (btn\w+): TSpeedButton(.*?)(?=end\b)', final_text, re.DOTALL)
for b_name, b_body in buttons:
    idx_m = re.search(r'ImageIndex = (-?\d+)', b_body)
    name_m = re.search(r'ImageName = ([^\r\n]+)', b_body)
    if name_m:
        raw_name = name_m.group(1).strip()
        clean_name = raw_name[1:-1] if (raw_name.startswith("'") and raw_name.endswith("'")) else raw_name
        target_idx = rib_name_to_index.get(raw_name, rib_name_to_index.get(clean_name))
        act_idx = int(idx_m.group(1)) if idx_m else None
        if target_idx != act_idx:
            mismatches.append((b_name, raw_name, act_idx, target_idx))

print(f"Total buttons checked: {len(buttons)}")
print(f"Mismatches remaining: {len(mismatches)}")
for m in mismatches:
    print(' ', m)
