#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成「2026 秋促 · 科研周边礼品」展示大图（PNG）+ 同源 HTML。

数据源：工具/2026秋促-科研周边礼品清单.html 内嵌的 GIFTS 数组（34 款，含图/规格/单价/库存/标签）。
产出：产品与市场/科研礼品展示/科研礼品展示大图.png（高清长图）+ 同源 index.html
"""
import json
import os
import re
import sys

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
sys.path.insert(0, os.path.join(ROOT, '脚本'))
import brand_kit as BK

SRC = os.path.join(ROOT, '工具/2026秋促-科研周边礼品清单.html')
OUTDIR = os.path.join(ROOT, '产品与市场/科研礼品展示')
CATS = [('custom', '定制周边 · 印 Logo', '日常普发与实验室刚需，全部可印宝锐 Logo'),
        ('event', '活动礼品 · 主题活动款', '开学季 / 集赞送礼等活动随手礼与趣味款'),
        ('ondemand', '答谢礼品 · 中高端', '按需申请，用于重点课题组与商务答谢')]


def load_gifts():
    h = open(SRC, encoding='utf-8').read()
    m = re.search(r'(?:const|var|let)\s+GIFTS\s*=\s*(\[.*?\]);', h, re.S)
    gifts = json.loads(m.group(1))
    for g in gifts:
        img = g.get('img') or ''
        if img and not img.startswith('data:'):
            g['img'] = 'data:image/jpeg;base64,' + img
        try:
            g['price_n'] = float(str(g.get('price') or 0))
        except ValueError:
            g['price_n'] = 0.0
    return gifts


def card(g):
    stock = g.get('stock') or '—'
    hot = '<span class="hot">热</span>' if str(g.get('is_hot')) == 'True' else ''
    new = '<span class="new">新</span>' if str(g.get('is_new')) == 'True' else ''
    return f"""<div class="card">
  <div class="imgbox"><img src="{g['img']}" alt="{g['name']}"></div>
  <div class="body">
    <div class="name">{g.get('name','')} {hot}{new}</div>
    <div class="spec">{g.get('spec','')}</div>
    <div class="meta"><span class="price">¥{g.get('price','')}</span><span class="tag">{g.get('tag','')}</span><span class="stock">库存 {stock}</span></div>
    <div class="scene">{g.get('scene','')}</div>
  </div>
</div>"""


def build_html(gifts):
    secs = []
    for key, title, desc in CATS:
        gs = sorted([g for g in gifts if g.get('cat') == key], key=lambda x: x['price_n'])
        if not gs:
            continue
        secs.append(f'<section><div class="sechead"><h2>{title}<span class="cnt">{len(gs)} 款</span></h2><p>{desc}</p></div>'
                    f'<div class="grid">{"".join(card(g) for g in gs)}</div></section>')
    pays = sorted([g for g in gifts if g.get('name') in
                   ('华为蓝牙耳机', '星巴克桂花礼盒', '澳门葡记小金盒手信', '闽饮茶叶')], key=lambda x: x['price_n'])
    price_note = '　'.join(f"{g['name']} ¥{g['price']}" for g in pays) if pays else ''
    now = __import__('datetime').datetime.now().strftime('%Y-%m-%d')
    html = f"""<!DOCTYPE html><html lang="zh-CN"><head><meta charset="utf-8">
<title>宝锐生物 · 2026 秋促科研周边礼品展示</title>
<style>
*{{box-sizing:border-box}}
body{{margin:0;background:#eef2f7;font:15px/1.6 -apple-system,"PingFang SC","Microsoft YaHei",sans-serif;color:#1c2430}}
.wrap{{max-width:1560px;margin:0 auto;padding:0 28px 34px}}
.hero{{background:linear-gradient(135deg,#0b3d91,#1a5fb4 60%,#2b7fd4);color:#fff;padding:26px 28px;border-radius:0 0 16px 16px;margin-bottom:20px}}
.hero h1{{margin:0 0 6px;font-size:29px;letter-spacing:.5px}}
.hero p{{margin:0;opacity:.92;font-size:14px}}
.hero .chips{{margin-top:12px;display:flex;gap:9px;flex-wrap:wrap}}
.hero .chips span{{background:rgba(255,255,255,.16);border:1px solid rgba(255,255,255,.28);border-radius:999px;padding:4px 12px;font-size:12.5px}}
section{{margin:22px 0 6px}}
.sechead{{display:flex;align-items:baseline;gap:12px;border-left:5px solid #1a5fb4;padding-left:12px;margin-bottom:12px}}
.sechead h2{{margin:0;font-size:20px;color:#0b3d91}}
.sechead .cnt{{font-size:12.5px;color:#5f6b7a;font-weight:400;margin-left:8px}}
.sechead p{{margin:0;font-size:12.5px;color:#5f6b7a}}
.grid{{display:grid;grid-template-columns:repeat(4,1fr);gap:16px}}
.card{{background:#fff;border:1px solid #e3e8ef;border-radius:14px;overflow:hidden;display:flex;flex-direction:column}}
.imgbox{{height:212px;background:#f7f9fc;display:flex;align-items:center;justify-content:center;padding:10px}}
.imgbox img{{max-width:100%;max-height:100%;object-fit:contain}}
.body{{padding:11px 13px 13px;display:flex;flex-direction:column;gap:5px}}
.name{{font-size:15.5px;font-weight:700;color:#12233d}}
.spec{{font-size:12px;color:#5f6b7a;min-height:32px}}
.meta{{display:flex;align-items:center;gap:8px;flex-wrap:wrap}}
.price{{color:#c2410c;font-weight:800;font-size:17px}}
.tag{{background:#eaf3ff;color:#1a5fb4;border:1px solid #cfe3ff;border-radius:6px;padding:1px 7px;font-size:11.5px}}
.stock{{font-size:11.5px;color:#8894a3}}
.scene{{font-size:11.5px;color:#7c8798;border-top:1px dashed #e6ebf2;padding-top:6px}}
.hot{{background:#ffe8e8;color:#c62828;border-radius:5px;font-size:10.5px;padding:1px 5px;vertical-align:middle}}
.new{{background:#e8f7ee;color:#1a7f37;border-radius:5px;font-size:10.5px;padding:1px 5px;vertical-align:middle}}
.notes{{background:#fff;border:1px solid #e3e8ef;border-radius:14px;padding:16px 18px;margin-top:22px;font-size:13px}}
.notes h3{{margin:0 0 8px;font-size:15px;color:#0b3d91}}
.notes li{{margin:3px 0;color:#41506b}}
</style></head><body>
<div class="hero">
  <h1>2026 秋促 · 科研周边礼品展示</h1>
  <p>宝锐生物 ｜ 生命科学销售部 ｜ 共 {len(gifts)} 款礼品 · 全部可印 Logo · 更新于 {now}</p>
  <div class="chips"><span>走量普发 ¥1.3 起</span><span>实验刚需</span><span>活动趣味款</span><span>中高端答谢</span><span>全部含实拍图</span></div>
</div>
<div class="wrap">
{''.join(secs)}
<div class="notes"><h3>档位与服务说明</h3><ul>
<li>礼品全部支持印制宝锐 Logo（定制款）；活动款按活动方案发放。</li>
<li>中高端答谢款（{price_note}）按需申请，库存有限，请提前报备。</li>
<li>库存为 2026 秋促活动期库存，出库以礼品下单系统实时数据为准。</li>
<li>内部资料 · 请勿外发。</li>
</ul></div>
</div></body></html>"""
    return html


def main():
    os.makedirs(OUTDIR, exist_ok=True)
    gifts = load_gifts()
    html = build_html(gifts)
    html = BK.inject(html, theme='light', tag='生命科学销售部 · 礼品展示',
                     footer_extra='2026 秋促 · 科研周边礼品 ｜ 内部资料')
    chk = BK.verify(html)
    assert all(chk.values()), chk
    p = os.path.join(OUTDIR, '科研礼品展示.html')
    open(p, 'w', encoding='utf-8').write(html)
    print('HTML %.0f KB → %s' % (len(html) / 1024.0, p))
    print('品牌自检:', chk)
    return OUTDIR, p


if __name__ == '__main__':
    main()
