import hashlib
import json
import shutil
from datetime import datetime
from pathlib import Path
from zoneinfo import ZoneInfo

from openpyxl import load_workbook
from openpyxl.drawing.image import Image as SheetImage
from PIL import Image

root = Path(__file__).resolve().parent
output = root / "output"
source = Path("/Users/jack/.codex/generated_images/01a0ed40-cf75-7e40-8042-c48e02fc0b41/exec-fee05142-1e26-421c-959f-9e79616fda91.png")
final = output / "哈尔滨膳质舍-3D场景图-融合版.png"
primary = output / "哈尔滨膳质舍-3D场景图.png"
book = output / "哈尔滨膳质舍-场景说明.xlsx"
history = output / "history"
history.mkdir(exist_ok=True)
for original, name in [
    (primary, "哈尔滨膳质舍-3D场景图-贴图版-20260930.png"),
    (book, "哈尔滨膳质舍-场景说明-贴图版-20260930.xlsx"),
]:
    target = history / name
    if not target.exists():
        shutil.copy2(original, target)
shutil.copy2(source, final)
shutil.copy2(final, primary)
wb = load_workbook(book)
ws = wb["场景说明"]
ws["D3"] = "C级：真实产品图参考的场景融合示意"
ws["A18"] = "2. 3D主图（融合版；设备透视与光影经AI调整，非现场实拍）"
if ws["A16"].value and str(ws["A16"].value).startswith("2. 3D主图"):
    ws["A16"] = "08"
ws._images.clear()
im = SheetImage(final)
im.width, im.height = 1672, 941
ws.add_image(im, "A19")
ledger = wb["来源明细"]
label = "2026-09-30设备场景融合修订"
row = next((r for r in range(1, ledger.max_row + 1) if ledger.cell(r, 1).value == label), ledger.max_row + 1)
for col, value in enumerate([
    label, str(final), "统一设备比例、透视、台面落位、接触阴影与遮挡",
    "内置imagegen基于已确认设备图融合；场景目检两排各5台双秤、每台2个菜盆。不是未处理的产品原始照片。",
], 1):
    ledger.cell(row, col, value)
wb.save(book)
check = load_workbook(book)
assert len(check["场景说明"]._images) == 1
embedded = check["场景说明"]._images[0]._data()
digest = hashlib.sha256(final.read_bytes()).hexdigest()
assert hashlib.sha256(embedded).hexdigest() == digest
with Image.open(final) as img:
    dimensions = list(img.size)
receipt = {
    "date": datetime.now(ZoneInfo("Asia/Shanghai")).isoformat(),
    "image": str(final),
    "dimensions": dimensions,
    "sha256": digest,
    "workbook_embedded_image_matches": True,
    "visual_review": "两排各5台，10台双秤、20个菜盆；称重台落在台面，比例与光影统一。",
    "method": "built-in imagegen reference-guided harmonization",
    "boundary": "参考真实产品外观的AI场景融合示意，C级，非原始实拍。",
    "previous_validation": "validation.json描述上一贴图版；当前版本以此记录为准。",
}
(root / "validation-harmonized.json").write_text(json.dumps(receipt, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
print(json.dumps(receipt, ensure_ascii=False, indent=2))
