#!/usr/bin/env python3
"""Edit previously created PO training records to realistic procurement wording.
Runs inside interactive Windows desktop via scheduled task.
"""
import json, time
from pathlib import Path
import pyautogui, pyperclip

pyautogui.FAILSAFE = False
pyautogui.PAUSE = 0.06
ROOT = Path(r"C:\MCSJAgent\proof\MichelBridge")
ROOT.mkdir(parents=True, exist_ok=True)

SAVE_YES = (482, 620)


def click(x, y, wait=0.25):
    pyautogui.click(x, y)
    time.sleep(wait)


def paste_text(text, wait=0.18):
    pyperclip.copy(text)
    pyautogui.hotkey('ctrl', 'v')
    time.sleep(wait)


def replace_field(x, y, text, wait=0.18):
    click(x, y, 0.08)
    pyautogui.hotkey('ctrl', 'a')
    time.sleep(0.04)
    paste_text(text, wait)


def shot(label):
    path = ROOT / f"realistic-edit-{label}-{time.strftime('%Y%m%d-%H%M%S')}.png"
    im = pyautogui.screenshot()
    im.save(path)
    return str(path)


def save_record(wait=0.9):
    click(130, 225, 0.55)  # Save button after edit
    click(*SAVE_YES, wait=wait)


def edit_header(label, desc, comment):
    before = shot(f"{label}-before-header")
    click(130, 225, 0.45)       # Edit
    replace_field(180, 410, desc, 0.18)
    replace_field(670, 600, comment, 0.18)
    save_record(1.2)
    after = shot(f"{label}-after-header")
    return {"before": before, "after": after, "desc": desc, "comment": comment}


def edit_current_line(desc):
    click(130, 225, 0.35)       # Edit on line-item form
    replace_field(185, 462, desc, 0.15)
    save_record(0.9)


def edit_three_lines(label, line_descs):
    click(755, 225, 0.8)        # Line Item from header
    before = shot(f"{label}-before-lines")
    # Line item window usually opens at last line; edit 3, previous to 2, previous to 1.
    edit_current_line(line_descs[2])
    click(460, 225, 0.55)       # Previous -> line 2
    edit_current_line(line_descs[1])
    click(460, 225, 0.55)       # Previous -> line 1
    edit_current_line(line_descs[0])
    after = shot(f"{label}-after-lines")
    click(250, 225, 0.8)        # Close line-item window
    final_header = shot(f"{label}-final-header")
    return {"before": before, "after": after, "final_header": final_header, "line_descs": line_descs}


def previous_header(wait=1.0):
    click(460, 225, wait)       # Previous button on header form


def main():
    start = time.perf_counter()
    proof = {}
    # Current screen expected: PO 26-2121 header with bad Michel/demo text.
    proof['26-2121_header'] = edit_header(
        '26-2121',
        'Public works field supplies',
        'Deliver to DPW receiving; match invoice to packing slip.'
    )
    proof['26-2121_lines'] = edit_three_lines(
        '26-2121',
        ['Field repair supplies', 'Permit office materials', 'Maintenance replacement parts']
    )

    previous_header(1.0)  # PO 26-2120
    proof['26-2120_header'] = edit_header(
        '26-2120',
        'Building maintenance supplies',
        'Receiving to verify quantities before invoice approval.'
    )
    proof['26-2120_lines'] = edit_three_lines(
        '26-2120',
        ['Building repair materials', 'Facility supply restock', 'Receiving documentation review']
    )

    previous_header(1.0)  # PO 26-2119
    proof['26-2119_header'] = edit_header(
        '26-2119',
        'Operations supply order',
        'Use standard receiving process and retain packing slip.'
    )
    final = shot('all-final')
    print(json.dumps({"ok": True, "elapsed_seconds": round(time.perf_counter()-start, 2), "proof": proof, "final": final}, separators=(',', ':')))

if __name__ == '__main__':
    main()
