import os
from typing import Any

from openpyxl import Workbook, load_workbook
from openpyxl.worksheet.worksheet import Worksheet


def write_row(file_path: str, row_data: dict[str, Any]) -> None:
    new_keys = list(row_data.keys())

    if not os.path.exists(file_path):
        wb = Workbook()
        ws: Worksheet = wb.active  # type: ignore[assignment]
        ws.append(new_keys)
        ws.append(list(row_data.values()))
        wb.save(file_path)
        return

    wb = load_workbook(file_path)
    ws = wb.active  # type: ignore[assignment]

    # Build a mutable header list and insert new columns using insert_cols so
    # that existing row data shifts along with the headers.
    # Filter out None to guard against blank columns in the source file.
    headers: list[str] = [cell.value for cell in ws[1] if cell.value is not None]  # type: ignore[misc]

    for key in new_keys:
        if key in headers:
            continue

        # Find the first key that comes after this one in new_keys that already
        # exists in headers — insert before it to keep columns logically grouped.
        insert_before: str | None = None
        found = False
        for k in new_keys:
            if k == key:
                found = True
                continue
            if found and k in headers:
                insert_before = k
                break

        if insert_before is not None:
            col_idx = headers.index(insert_before) + 1  # 1-based
            ws.insert_cols(col_idx)
            ws.cell(row=1, column=col_idx, value=key)
            headers.insert(col_idx - 1, key)
        else:
            headers.append(key)
            ws.cell(row=1, column=len(headers), value=key)

    ws.append([row_data.get(col) for col in headers])
    wb.save(file_path)
