from __future__ import annotations

from pathlib import Path

from openpyxl import load_workbook
from openpyxl.drawing.image import Image as XLImage
from openpyxl.styles import Alignment
from PIL import Image, ImageDraw

from generate_visual_excel import (
    AMBER,
    BG,
    BLUE,
    CORAL,
    DERIVED,
    F14,
    F16,
    F18,
    F20,
    F24,
    F28,
    F34,
    FONT_PATH,
    GREEN,
    INK,
    LINE,
    MUTED,
    NAVY,
    PURPLE,
    ROOT,
    TEAL,
    add_title,
    contain,
    cover,
    draw_tag,
    draw_text,
    font,
    hex_rgb,
    paste_round,
    rounded_rect,
    shadowed_panel,
)


SRC_XLSX = ROOT / "outputs" / "product-weekly-report-visual-refresh-20260530.xlsx"
OUT_XLSX = ROOT / "outputs" / "product-weekly-report-visual-refresh-ai-native-revised-20260530.xlsx"
DOCX_MEDIA = ROOT / "source-assets" / "ai-native-docx-media" / "media"

F30 = font(30)
F38 = font(38)


def docx_img(name: str) -> Image.Image:
    return Image.open(DOCX_MEDIA / name).convert("RGB")


def draw_flow_arrow(draw: ImageDraw.ImageDraw, start_x: int, end_x: int, y: int, color: str = "#9AAFC2"):
    draw.line((start_x, y, end_x, y), fill=hex_rgb(color), width=5)
    draw.polygon([(end_x, y), (end_x - 20, y - 12), (end_x - 20, y + 12)], fill=hex_rgb(color))


def draw_small_metric(draw: ImageDraw.ImageDraw, x: int, y: int, label: str, value: str, color: str):
    rounded_rect(draw, (x, y, x + 202, y + 82), 18, "white", LINE, 1)
    draw.text((x + 18, y + 14), label, font=F16, fill=MUTED)
    draw.text((x + 18, y + 42), value, font=F24, fill=hex_rgb(color))


def panel_ai_ipo_rewritten(path: Path):
    canvas = Image.new("RGBA", (1500, 500), BG)
    d = ImageDraw.Draw(canvas)
    add_title(d, "AI 赋能：全员转向 AI Agent", "不是“大家都会问 AI”，而是形成 Input - Process - Output - Reuse 的组织协作底座", 1500, TEAL)

    shadowed_panel(canvas, (42, 120, 408, 394), radius=22, fill="white")
    d.text((72, 150), "要表达的核心", font=F28, fill=INK)
    draw_text(
        d,
        (74, 200),
        "真正的效率瓶颈不是写代码或写方案，而是资料找不回、上下文反复补、角色传递失真、评审交接靠个人经验。",
        F18,
        MUTED,
        max_width=290,
        line_gap=8,
    )
    draw_tag(d, 74, 326, "AI Native = 协作方式升级", NAVY, F16)

    items = [
        ("Input", "事实源", "资料、会议、任务、代码问题先进入索引与契约", BLUE),
        ("Process", "Agent 执行", "读取上下文，调用技能和流程，按规则推进", TEAL),
        ("Output", "资产沉淀", "文档、索引、证据\n手册、复盘、规则", AMBER),
        ("Reuse", "下次复用", "同类任务复用模板、流程\n和验证标准", CORAL),
    ]
    for i, (title, tag, desc, color) in enumerate(items):
        x = 450 + i * 250
        shadowed_panel(canvas, (x, 142, x + 210, 344), radius=20, fill="white")
        d.rounded_rectangle((x + 22, 168, x + 74, 220), radius=16, fill=hex_rgb(color))
        d.text((x + 90, 166), title, font=F24, fill=hex_rgb(color))
        d.text((x + 90, 198), tag, font=F18, fill=INK)
        draw_text(d, (x + 24, 244), desc, F15 if False else F16, MUTED, max_width=158, line_gap=7)
        if i < 3:
            draw_flow_arrow(d, x + 214, x + 240, 244)

    metrics = [
        ("Skill", "67 个", TEAL),
        ("Workflow", "50 个", BLUE),
        ("任务证据", "144 条", AMBER),
        ("文件索引", "57,265 条", CORAL),
    ]
    for i, (label, value, color) in enumerate(metrics):
        draw_small_metric(d, 450 + i * 250, 380, label, value, color)

    canvas.convert("RGB").save(path, quality=95)


def evidence_card(canvas: Image.Image, box: tuple[int, int, int, int], image_name: str, title: str, desc: str, accent: str, mode: str = "cover"):
    x1, y1, x2, y2 = box
    shadowed_panel(canvas, box, radius=18, fill="white")
    d = ImageDraw.Draw(canvas)
    d.rounded_rectangle((x1 + 18, y1 + 18, x1 + 28, y1 + 58), radius=5, fill=hex_rgb(accent))
    d.text((x1 + 42, y1 + 18), title, font=F20, fill=INK)
    d.text((x1 + 42, y1 + 48), desc, font=F14, fill=MUTED)
    fitted_box = (x1 + 18, y1 + 82, x2 - 18, y2 - 18)
    paste_round(canvas, docx_img(image_name), fitted_box, radius=14, mode=mode)


def panel_ai_evidence_rewritten(path: Path):
    canvas = Image.new("RGBA", (1500, 780), BG)
    d = ImageDraw.Draw(canvas)
    add_title(d, "AI Native 协作成果化", "从分散资料和长链路流程，走向统一上下文、Agent 执行、人审留痕、资产复用", 1500, PURPLE)

    evidence_card(canvas, (42, 126, 502, 382), "image1.jpeg", "Before：传统研发链路", "环节多、传递长，想法到上线周期长", BLUE, mode="contain")
    evidence_card(canvas, (532, 126, 1008, 382), "image2.jpeg", "Before：资料分散", "共享盘和项目文件靠人同步、靠人记忆", CORAL, mode="cover")
    evidence_card(canvas, (1038, 126, 1458, 382), "image3.jpeg", "After：统一任务入口", "需求、状态、责任人和进度进入云效协作面", TEAL, mode="cover")

    evidence_card(canvas, (42, 424, 728, 720), "image4.jpeg", "After：同一上下文生成交付物", "Agent 基于任务说明生成需求、验收、代码和文档证据", AMBER, mode="cover")
    evidence_card(canvas, (772, 424, 1458, 720), "image5.jpeg", "落地入口：zhctprompt 控制项目", "规则、索引、任务队列、证据和 skill 回到统一入口", PURPLE, mode="cover")

    canvas.convert("RGB").save(path, quality=95)


def rewrite_cells(ws):
    top = Alignment(horizontal="left", vertical="top", wrap_text=True)
    ws["A120"] = "03  AI 赋能：全员转 AI Agent，形成 IPO 协作底座"
    ws["A121"] = (
        "结论先行：三月份开始推动的全员转 AI Agent，不是“大家都会问 AI”，而是把需求、资料、任务、代码、测试、交付和复盘统一纳入 IPO 信息流；"
        "让信息先结构化、Agent 参与执行验证、人负责评审决策，最终沉淀为 AI 能读懂、人能复查、下次能复用的组织资产。"
    )
    ws["A138"] = "AI Native 的真实含义：从个人提效工具，升级为组织协作底座"
    ws["A139"] = (
        "这部分要表达的重点，是产品开发部协作方式正在被重构。真正消耗团队效率的，不只是 coding 或写方案，而是方向反复变化、信息在角色之间传递失真、上下文反复补齐、评审和交接靠个人经验。"
        "AI Native 的做法，是把客户资料、会议纪要、云效任务、微盘文件和代码问题先变成可追踪事实源；再由 Agent 读取上下文、判断任务类型、调用 skill 和 workflow，按固定流程执行；"
        "最后留下代码、文档、索引、HTML、测试记录、任务证据、手册、复盘和可复用规则。当前 67 个 skill、50 个流程类资产、144 条任务证据、144 个 HTML 页面、57,265 条文件索引、6,318 条文档索引、55 个来源索引和 83 份工作总结，"
        "证明的不是“AI 很热闹”，而是团队知识资产、技能资产、流程资产、证据资产和治理资产正在成型。"
    )

    rows = {
        144: (
            "Input",
            "客户资料、会议纪要、云效任务、微盘文件、代码问题等先进入来源索引、任务契约和项目入口，变成可追踪事实源。",
            "57,265 文件索引；6,318 文档索引；55 来源索引。",
            "补人工查找耗时 vs 索引定位耗时，证明资料检索提效。",
        ),
        145: (
            "Process",
            "Agent 基于同一上下文判断任务类型，调用 skill/workflow，按 DEFINE、PLAN、BUILD、VERIFY、REVIEW、SHIP 执行；人保留评审与决策。",
            "67 个 skill；50 个 workflow/流程类资产；已进入需求澄清、资料检索、方案、开发、验证、手册复盘等流程。",
            "补需求分析、评审准备、交接恢复的原耗时/AI 后耗时。",
        ),
        146: (
            "Output",
            "每次任务必须留下别人能看懂、能接手、能复用的 Markdown、HTML、CSV、任务索引、测试记录、截图、手册、复盘和规则。",
            "144 个 HTML 页面；144 条任务证据；83 份工作总结。",
            "补被复用的任务清单和客户/内部验收证据。",
        ),
        147: (
            "Reuse",
            "下一次同类任务从已有上下文、模板、验证规则和微盘索引启动，减少重新查资料、重新问人、重新建立判断标准。",
            "复用次数、原耗时/新耗时待补。",
            "优先沉淀需求沟通、需求分析、销售方案生成、评审验证 skill。",
        ),
    }
    for row, (stage, now, support, next_step) in rows.items():
        ws[f"A{row}"] = stage
        ws[f"D{row}"] = now
        ws[f"I{row}"] = support
        ws[f"M{row}"] = next_step

    ws["D152"] = (
        "本次第三部分重写新增真源：/Users/jack/Downloads/Telegram Lite/周报素材/AI_Native_协作成果化周报材料.docx；"
        "同时参考产品差异性、产品标准化、学校方案、周报素材等既有来源。"
    )
    ws["D156"] = (
        "本表可证明产品差异性、标准化路径和 AI Native 阶段成果已经形成。AI Native 部分可证明资产沉淀和协作底座初步成型；"
        "暂不写成已验证效率百分比、毛利提升或交付成本下降，后续需补原耗时、AI 后耗时、复用次数和客户验收证据。"
    )

    for cell in ["A121", "A139", "D144", "I145", "M145", "D146", "D147", "D152", "D156"]:
        ws[cell].alignment = top

    ws.row_dimensions[121].height = 58
    for row in [139, 140, 141]:
        ws.row_dimensions[row].height = 42
    for row in [144, 145, 146, 147]:
        ws.row_dimensions[row].height = 62
    ws.row_dimensions[152].height = 46
    ws.row_dimensions[156].height = 50


def replace_images(ws):
    ws._images = []
    panels = [
        ("panel-01-flow.png", "A12", 1600, 620),
        ("panel-01-evidence.png", "K12", 1500, 780),
        ("panel-02-standardization-map.png", "A44", 1600, 680),
        ("panel-02-school-standardization.png", "K44", 1500, 580),
        ("panel-02-enterprise-evidence.png", "A73", 1500, 780),
        ("panel-02-school-evidence.png", "A104", 1500, 780),
        ("panel-03-ai-ipo-rewritten.png", "A123", 1500, 500),
        ("panel-03-ai-native-evidence-rewritten.png", "K123", 1500, 780),
    ]
    for name, anchor, width, height in panels:
        img = XLImage(str(DERIVED / name))
        img.width = width
        img.height = height
        ws.add_image(img, anchor)


def main():
    DERIVED.mkdir(parents=True, exist_ok=True)
    panel_ai_ipo_rewritten(DERIVED / "panel-03-ai-ipo-rewritten.png")
    panel_ai_evidence_rewritten(DERIVED / "panel-03-ai-native-evidence-rewritten.png")

    wb = load_workbook(SRC_XLSX)
    ws = wb["产品周报汇报版"]
    rewrite_cells(ws)
    replace_images(ws)
    wb.save(OUT_XLSX)
    print(OUT_XLSX)


if __name__ == "__main__":
    main()
