#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""生成《实验加速季 · 集赞中奖登记表》xlsx（含下拉校验 + 说明sheet + 中奖序号表）。

输出：营销活动/2026-10实验加速季/集赞中奖登记表.xlsx
字段口径见技能 baoyu-social-like-campaign §7。
"""
import os

from openpyxl import Workbook
from openpyxl.styles import Alignment, Border, Font, PatternFill, Side
from openpyxl.utils import get_column_letter
from openpyxl.worksheet.datavalidation import DataValidation

ROOT = '/Users/liuxinyuan/Desktop/Hermes输出-工作类'
OUTDIR = os.path.join(ROOT, '营销活动', '2026-10实验加速季')
os.makedirs(OUTDIR, exist_ok=True)
OUT = os.path.join(OUTDIR, '集赞中奖登记表.xlsx')

# 中奖序号：8 的倍数 ∪ 个位是 8（与文案枚举一致）
SEQ = []
n = 1
while len(SEQ) < 120:
    if n % 8 == 0 or '8' in str(n):
        SEQ.append(n)
    n += 1

COLS = [
    ('日期', 12, '填写登记当天日期'),
    ('子活动', 12, '①第一季(10.12发布)/②第二季(10.19发布)'),
    ('客户/课题组', 26, '客户单位或课题组名'),
    ('联系人', 10, ''),
    ('联系电话', 15, ''),
    ('销售', 10, '本单归属销售'),
    ('点赞序号', 10, '必须是中奖序号：8的倍数或个位是8'),
    ('中奖截图文件名', 30, '★开奖凭证：微信「XXX赞了你的朋友圈」逐条通知截图'),
    ('奖品品类', 14, '咖啡券/奶茶券/伴手礼'),
    ('具体礼品名', 20, '如 瑞幸咖啡券 / 实验记录本'),
    ('寄送地址', 34, '★个人礼品优先实物；单位口径另走样品'),
    ('快递单号', 18, ''),
    ('寄出日期', 12, '11.10 前统一寄出'),
    ('备注', 26, ''),
]

HEAD_FILL = PatternFill('solid', fgColor='1852B6')
HEAD_FONT = Font(color='FFFFFF', bold=True, size=11)
THIN = Side(style='thin', color='C9D3E0')
BORDER = Border(left=THIN, right=THIN, top=THIN, bottom=THIN)
WARN_FILL = PatternFill('solid', fgColor='FFF6E5')

wb = Workbook()

# ── Sheet1 登记表 ──
ws = wb.active
ws.title = '集赞中奖登记表'
ws['A1'] = '宝锐生物 · 2026年10月「实验加速季」朋友圈集赞送礼 —— 集赞中奖登记表'
ws['A1'].font = Font(bold=True, size=13, color='0F3A8A')
ws.merge_cells(start_row=1, start_column=1, end_row=1, end_column=len(COLS))
ws['A2'] = ('一次活动 · 一份礼品 · 一张签收 ｜ 开奖凭证 = 微信「XXX 赞了你的朋友圈」逐条通知截图（昵称中间字打码后公示）'
            ' ｜ 券类以「朋友圈集赞互动回馈」名义发放，不与采购量/订单金额挂钩 ｜ 内部资料，不得外发')
ws['A2'].font = Font(size=9, color='8A6100')
ws.merge_cells(start_row=2, start_column=1, end_row=2, end_column=len(COLS))
ws['A2'].fill = WARN_FILL

for i, (name, width, _) in enumerate(COLS, 1):
    c = ws.cell(row=4, column=i, value=name)
    c.fill, c.font = HEAD_FILL, HEAD_FONT
    c.alignment = Alignment(horizontal='center', vertical='center', wrap_text=True)
    c.border = BORDER
    ws.column_dimensions[get_column_letter(i)].width = width
ws.row_dimensions[4].height = 30

LAST = 4 + 200
for r in range(5, LAST + 1):
    for i in range(1, len(COLS) + 1):
        cc = ws.cell(row=r, column=i)
        cc.border = BORDER
        cc.alignment = Alignment(vertical='center', wrap_text=(i in (3, 11, 14)))

dv1 = DataValidation(type='list', formula1='"①第一季(10.12),②第二季(10.19)"', allow_blank=True)
dv1.error = '只能选 ①第一季 或 ②第二季'
ws.add_data_validation(dv1)
dv1.add('B5:B%d' % LAST)

dv2 = DataValidation(type='list', formula1='"咖啡券,奶茶券,伴手礼"', allow_blank=True)
dv2.error = '只能选 咖啡券 / 奶茶券 / 伴手礼'
ws.add_data_validation(dv2)
dv2.add('I5:I%d' % LAST)

dv3 = DataValidation(type='list', formula1='"是,否"', allow_blank=True)
dv3.prompt = '该序号是否为中奖序号？（含数字 8 或 8 的倍数）'
ws.add_data_validation(dv3)
dv3.add('N5:N%d' % LAST)

ws.freeze_panes = 'A5'
ws.auto_filter.ref = 'A4:%s%d' % (get_column_letter(len(COLS)), LAST)

# ── Sheet2 口径与序号表 ──
w2 = wb.create_sheet('说明与中奖序号')
w2['A1'] = '口径与开奖序号（内部）'
w2['A1'].font = Font(bold=True, size=13, color='0F3A8A')
rows = [
    ('', ''),
    ('活动结构', '子活动①（第一季）10.12 20:00 发布 → 10.13 20:00 结算 ｜ 主推 BR1D303 + BR1E102'),
    ('', '子活动②（第二季）10.19 20:00 发布 → 10.20 20:00 结算 ｜ 主推 BR1C103'),
    ('', '礼品统一 11.10 前寄出'),
    ('', ''),
    ('中奖规则', '客户点赞，点赞序号「含数字 8」或「8 的倍数」满足其一即中奖；奖品二选一（券 / 等值伴手礼）'),
    ('中奖率', '约 28%（每 3–4 位点赞者约 1 位中奖）'),
    ('', ''),
    ('口径已确认', '2026-10-08 确认：按「含 8 或 8 的倍数，都中」执行 —— 81–89 整段都算中奖。'),
    ('预算提示', '中奖率由约 20% 升至约 28%，礼品份数预算需上浮约 40%。'),
    ('', ''),
    ('开奖取证（必做）', '1) 发布即截「0 赞」底图'),
    ('', '2) 主通道：微信「消息」→「XXX 赞了你的朋友圈」逐条带时间通知，按时间数第 N 条并截图'),
    ('', '3) 辅助：每小时截 1 张点赞列表，存时间序列'),
    ('', '4) 差值法：N-1 时截一张、到 N 再截一张，新增头像即第 N 位'),
    ('', '5) 公示：中奖通知截图（昵称中间字打码）发评论区并 @客户'),
    ('', '6) 登记：本表逐条录入，做到一次活动一份礼品一张签收'),
    ('', '两条铁律：活动期内不清微信消息 ｜ 盯「到 8 / 到 16」的瞬间'),
    ('', ''),
    ('合规红线', '1) 高校/科研院所走单位采购，赠品落个人名下易被认定回扣 → 优先引导实物礼品'),
    ('', '2) 保留点赞截图 + 本登记表，可追溯'),
    ('', '3) 券类以「朋友圈集赞互动回馈」名义发放，不与采购量、订单金额挂钩'),
    ('', '4) 本表含客户与礼品信息，仅内部使用，不得对外发送'),
]
for i, (k, v) in enumerate(rows, 3):
    w2.cell(row=i, column=1, value=k).font = Font(bold=bool(k), color='0F3A8A' if k else '000000')
    c = w2.cell(row=i, column=2, value=v)
    c.alignment = Alignment(wrap_text=True, vertical='center')
w2.column_dimensions['A'].width = 18
w2.column_dimensions['B'].width = 96

w2.cell(row=len(rows) + 5, column=1, value='中奖序号（前 120 个）').font = Font(bold=True, color='0F3A8A')
CH = 10
for idx, s in enumerate(SEQ):
    r = len(rows) + 6 + idx // CH
    c = w2.cell(row=r, column=2 + (idx % CH), value=s)
    c.alignment = Alignment(horizontal='center')
    c.font = Font(bold=True, color='1852B6')
    c.fill = PatternFill('solid', fgColor='E8F0FE')
    c.border = BORDER
for cc in range(2, 2 + CH):
    w2.column_dimensions[get_column_letter(cc)].width = 8

wb.save(OUT)
print('✅ 登记表 → %s（%.0f KB）' % (OUT, os.path.getsize(OUT) / 1024.0))
print('   Sheet1 集赞中奖登记表：%d 列 × 200 行（含 子活动/奖品品类/是否中奖序号 下拉校验）' % len(COLS))
print('   Sheet2 说明与中奖序号：口径 + 取证 SOP + 合规 + 前 120 个中奖序号')
print('   中奖序号前 20:', SEQ[:20])
