from pathlib import Path
from datetime import datetime
import re, zipfile, os, json
from docx import Document
from docx.shared import Pt, Cm, RGBColor
from docx.enum.text import WD_ALIGN_PARAGRAPH
from docx.enum.table import WD_TABLE_ALIGNMENT, WD_CELL_VERTICAL_ALIGNMENT
from docx.oxml import OxmlElement
from docx.oxml.ns import qn

from reportlab.lib import colors
from reportlab.lib.enums import TA_CENTER, TA_LEFT
from reportlab.lib.pagesizes import A4
from reportlab.lib.styles import getSampleStyleSheet, ParagraphStyle
from reportlab.lib.units import mm
from reportlab.platypus import SimpleDocTemplate, Paragraph, Spacer, Table, TableStyle, PageBreak
from reportlab.pdfbase.cidfonts import UnicodeCIDFont
from reportlab.pdfbase import pdfmetrics

PROJECT = Path('/Users/bot1/Volumes/root_for_ai/AI工作区/GAP_报价单_敦煌美术研究所两档方案_20260608_2010')
DELIVER = PROJECT / 'deliverables'
WORK = PROJECT / 'work'
DELIVER.mkdir(parents=True, exist_ok=True)
WORK.mkdir(parents=True, exist_ok=True)

DOCX_PATH = DELIVER / 'GAP_敦煌美术研究所IP联名授权报价单_70万80万一口价方案_20260608.docx'
PDF_PATH = DELIVER / 'GAP_敦煌美术研究所IP联名授权报价单_70万80万一口价方案_20260608.pdf'
README_PATH = PROJECT / 'README.md'

quote_date_cn = '2026年6月8日'
quote_date_slash = '2026/6/8'

# ---------- DOCX helpers ----------
def set_cell_shading(cell, fill):
    tcPr = cell._tc.get_or_add_tcPr()
    shd = OxmlElement('w:shd')
    shd.set(qn('w:fill'), fill)
    tcPr.append(shd)

def set_cell_text(cell, text, bold=False, color='222222', size=9.5):
    cell.text = ''
    p = cell.paragraphs[0]
    p.alignment = WD_ALIGN_PARAGRAPH.LEFT
    run = p.add_run(str(text))
    run.bold = bold
    run.font.name = 'PingFang SC'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
    run.font.size = Pt(size)
    run.font.color.rgb = RGBColor.from_string(color)
    cell.vertical_alignment = WD_CELL_VERTICAL_ALIGNMENT.CENTER

def style_table(table, header_rows=1):
    table.alignment = WD_TABLE_ALIGNMENT.CENTER
    table.style = 'Table Grid'
    for r, row in enumerate(table.rows):
        for cell in row.cells:
            cell.margin_top = Cm(0.08)
            cell.margin_bottom = Cm(0.08)
            cell.margin_left = Cm(0.08)
            cell.margin_right = Cm(0.08)
            for p in cell.paragraphs:
                for run in p.runs:
                    run.font.name = 'PingFang SC'
                    run._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
                    run.font.size = Pt(9.5)
            if r < header_rows:
                set_cell_shading(cell, 'EAF3F2')
                for p in cell.paragraphs:
                    for run in p.runs:
                        run.bold = True
                        run.font.color.rgb = RGBColor(31, 78, 72)


def add_heading(doc, text, level=1):
    p = doc.add_paragraph()
    p.style = f'Heading {level}'
    run = p.add_run(text)
    run.font.name = 'PingFang SC'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
    run.font.color.rgb = RGBColor(31, 78, 72)
    run.bold = True
    return p

def add_body(doc, text, bold=False):
    p = doc.add_paragraph()
    p.paragraph_format.space_after = Pt(6)
    p.paragraph_format.line_spacing = 1.18
    run = p.add_run(text)
    run.bold = bold
    run.font.name = 'PingFang SC'
    run._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
    run.font.size = Pt(10.5)
    run.font.color.rgb = RGBColor(38, 38, 38)
    return p

# ---------- content ----------
overview = [
    ['项目', '方案一｜70万一口价', '方案二｜80万一口价'],
    ['授权费用', '人民币70万元（一口价）', '人民币80万元（一口价）'],
    ['授权区域', '中国大陆地区及港澳地区', '中国大陆地区及港澳地区'],
    ['合作时间', '12个月', '12个月'],
    ['清货期', '6个月', '6个月'],
    ['授权款式数量', '可开发60个款', '可开发80个款'],
    ['图库授权', '可选择6套二创图库', '可选择6套二创图库'],
    ['合作品类', '服饰：男装、女装、男童、女童；并允许开发礼赠品', '服饰：男装、女装、男童、女童；并允许开发礼赠品'],
    ['礼赠品范围', '允许10个礼赠品品类，具体开发数量由客户方根据项目需求决定', '允许10个礼赠品品类，具体开发数量由客户方根据项目需求决定'],
    ['宣发支持', '配合3次 × 2波宣发支持', '配合3次 × 2波宣发支持'],
    ['活动支持', '允许开展活动；春季、秋季各设置一个主要活动方案；二三线城市非重点门店可直接使用 take down 版方案', '允许开展活动；春季、秋季各设置一个主要活动方案；二三线城市非重点门店可直接使用 take down 版方案'],
    ['防伪标', '0.7元/个，按实际使用数量另行结算', '0.7元/个，按实际使用数量另行结算'],
    ['开发时间', '开发期由双方协商，以最终协商结果为准', '开发期由双方协商，以最终协商结果为准'],
]

rights_detail = [
    ['权益模块', '具体内容', '70万方案', '80万方案'],
    ['IP / 图库使用', '可在授权范围内使用敦煌美术研究所相关授权IP、图库及二创图库，用于联名产品、包装、吊牌、线上线下宣传及配套物料。具体素材、使用方式及修改范围以双方确认及审核结果为准。', '6套二创图库', '6套二创图库'],
    ['款式开发', '在合作期内围绕授权IP开发联名服饰产品。', '60个款', '80个款'],
    ['品类范围', '服饰品类覆盖男装、女装、男童、女童；同时允许开发礼赠品，礼赠品涉及10个品类。', '包含', '包含'],
    ['礼赠品开发', '礼赠品品类上限为10个，具体每一品类的开发数量、组合方式及上市节奏由客户方根据项目需求决定，并按授权审核流程确认。', '包含', '包含'],
    ['宣发配合', '配合客户方完成联名项目宣发支持，按“3次 × 2波”节奏执行，具体平台、素材、发布时间及内容口径以双方排期和审核确认为准。', '包含', '包含'],
    ['活动支持', '允许围绕联名项目开展活动。春季与秋季各设置一个主要活动方案；二三线城市非重点门店可直接沿用 take down 版活动方案落地。', '包含', '包含'],
    ['防伪标', '联名产品如使用防伪标，按0.7元/个计费，依据实际使用数量另行结算。', '0.7元/个', '0.7元/个'],
    ['开发期', '产品开发期由双方协商确定，以最终协商结果及正式合同约定为准。', '双方协商', '双方协商'],
]

notes = [
    '本报价为GAP × 敦煌美术研究所IP联名授权合作的一口价报价方案，最终合作范围、授权素材、审核流程、付款节点、开票信息及双方责任边界以正式合同或补充协议为准。',
    '授权区域为中国大陆地区及港澳地区；如需扩展至台湾地区或其他海外地区，需另行书面确认。',
    '合作时间为12个月，清货期为6个月；清货期内的销售、宣传、库存处理及物料使用边界以合同约定为准。',
    '图库、Logo、商标、IP名称及文化内容的使用均需按授权流程提交审核后使用，未经书面确认不得超范围、超品类、超期限或超区域使用。',
    '活动方案、宣发节奏、门店落地及 take down 版方案的具体执行内容，以双方最终确认的项目排期、物料清单及审核结果为准。',
    '防伪标费用不包含在上述一口价授权费用内，按实际使用数量以0.7元/个另行结算。',
]

# ---------- create DOCX ----------
doc = Document()
sec = doc.sections[0]
sec.top_margin = Cm(1.5)
sec.bottom_margin = Cm(1.5)
sec.left_margin = Cm(1.6)
sec.right_margin = Cm(1.6)

styles = doc.styles
styles['Normal'].font.name = 'PingFang SC'
styles['Normal']._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
styles['Normal'].font.size = Pt(10.5)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('商务报价单')
r.bold = True
r.font.name = 'PingFang SC'
r._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
r.font.size = Pt(22)
r.font.color.rgb = RGBColor(31, 78, 72)

p = doc.add_paragraph()
p.alignment = WD_ALIGN_PARAGRAPH.CENTER
r = p.add_run('GAP × 敦煌美术研究所 IP 联名授权合作')
r.bold = True
r.font.name = 'PingFang SC'
r._element.rPr.rFonts.set(qn('w:eastAsia'), 'PingFang SC')
r.font.size = Pt(14)
r.font.color.rgb = RGBColor(89, 89, 89)

doc.add_paragraph()
info = [
    ['客户方', 'GAP（待确认主体）', '报价方', '杭州鲜活万物品牌管理有限公司（敦煌美术研究所独家代理）'],
    ['项目名称', 'GAP × 敦煌美术研究所 IP 联名授权合作', '报价日期', quote_date_slash],
    ['报价类型', '70万 / 80万一口价双方案', '报价有效期', '自报价日起30天'],
]
t = doc.add_table(rows=len(info), cols=4)
for i,row in enumerate(info):
    for j,val in enumerate(row):
        set_cell_text(t.cell(i,j), val, bold=(j in [0,2]), color='1F4E48' if j in [0,2] else '333333', size=9.5)
        if j in [0,2]: set_cell_shading(t.cell(i,j), 'F3F8F7')
style_table(t, header_rows=0)

add_heading(doc, '一、报价方案总览', 1)
t = doc.add_table(rows=len(overview), cols=3)
for i,row in enumerate(overview):
    for j,val in enumerate(row):
        set_cell_text(t.cell(i,j), val, bold=(i==0 or j==0), color='1F4E48' if (i==0 or j==0) else '222222', size=9.2)
        if i==0: set_cell_shading(t.cell(i,j), 'DDEDEA')
        elif j==0: set_cell_shading(t.cell(i,j), 'F4F8F7')
style_table(t, header_rows=1)

add_heading(doc, '二、授权权益明细', 1)
t = doc.add_table(rows=len(rights_detail), cols=4)
for i,row in enumerate(rights_detail):
    for j,val in enumerate(row):
        set_cell_text(t.cell(i,j), val, bold=(i==0 or j==0), color='1F4E48' if (i==0 or j==0) else '222222', size=8.8)
        if i==0: set_cell_shading(t.cell(i,j), 'DDEDEA')
        elif j==0: set_cell_shading(t.cell(i,j), 'F4F8F7')
style_table(t, header_rows=1)

add_heading(doc, '三、商务说明', 1)
for idx, note in enumerate(notes, 1):
    add_body(doc, f'{idx}. {note}')

add_heading(doc, '四、确认栏', 1)
confirm = [
    ['报价方', '杭州鲜活万物品牌管理有限公司', '客户方', 'GAP（待确认主体）'],
    ['联系人', '苏薇', '联系人', '待填写'],
    ['联系电话 / 邮箱', '15382320871', '联系电话 / 邮箱', '待填写'],
    ['确认日期', quote_date_cn, '确认日期', '待填写'],
]
t = doc.add_table(rows=len(confirm), cols=4)
for i,row in enumerate(confirm):
    for j,val in enumerate(row):
        set_cell_text(t.cell(i,j), val, bold=(j in [0,2]), color='1F4E48' if j in [0,2] else '333333', size=9.5)
        if j in [0,2]: set_cell_shading(t.cell(i,j), 'F3F8F7')
style_table(t, header_rows=0)

doc.save(DOCX_PATH)

# ---------- create PDF ----------
pdfmetrics.registerFont(UnicodeCIDFont('STSong-Light'))
styles = getSampleStyleSheet()
CN = ParagraphStyle('CN', parent=styles['Normal'], fontName='STSong-Light', fontSize=8.6, leading=12, textColor=colors.HexColor('#222222'), alignment=TA_LEFT)
CN_SMALL = ParagraphStyle('CN_SMALL', parent=CN, fontSize=7.6, leading=10.2)
TITLE = ParagraphStyle('TITLE', parent=CN, fontSize=20, leading=25, alignment=TA_CENTER, textColor=colors.HexColor('#1F4E48'))
SUBTITLE = ParagraphStyle('SUBTITLE', parent=CN, fontSize=12, leading=16, alignment=TA_CENTER, textColor=colors.HexColor('#555555'))
H = ParagraphStyle('H', parent=CN, fontSize=12, leading=16, textColor=colors.HexColor('#1F4E48'))

def P(text, style=CN):
    # keep take down readable
    return Paragraph(str(text).replace('\n','<br/>'), style)

def make_table(data, col_widths, small=False):
    st = CN_SMALL if small else CN
    tbl = Table([[P(x, st) for x in row] for row in data], colWidths=col_widths, repeatRows=1)
    tbl.setStyle(TableStyle([
        ('BACKGROUND', (0,0), (-1,0), colors.HexColor('#DDEDEA')),
        ('TEXTCOLOR', (0,0), (-1,0), colors.HexColor('#1F4E48')),
        ('BACKGROUND', (0,1), (0,-1), colors.HexColor('#F4F8F7')),
        ('GRID', (0,0), (-1,-1), 0.5, colors.HexColor('#9EB9B5')),
        ('VALIGN', (0,0), (-1,-1), 'MIDDLE'),
        ('LEFTPADDING', (0,0), (-1,-1), 4),
        ('RIGHTPADDING', (0,0), (-1,-1), 4),
        ('TOPPADDING', (0,0), (-1,-1), 4),
        ('BOTTOMPADDING', (0,0), (-1,-1), 4),
    ]))
    return tbl

pdf = SimpleDocTemplate(str(PDF_PATH), pagesize=A4, rightMargin=12*mm, leftMargin=12*mm, topMargin=12*mm, bottomMargin=12*mm)
story = []
story.append(P('商务报价单', TITLE)); story.append(Spacer(1, 3*mm))
story.append(P('GAP × 敦煌美术研究所 IP 联名授权合作', SUBTITLE)); story.append(Spacer(1, 7*mm))
story.append(make_table(info, [22*mm, 66*mm, 22*mm, 76*mm])); story.append(Spacer(1, 6*mm))
story.append(P('一、报价方案总览', H)); story.append(Spacer(1, 2*mm))
story.append(make_table(overview, [30*mm, 80*mm, 80*mm], small=True)); story.append(PageBreak())
story.append(P('二、授权权益明细', H)); story.append(Spacer(1, 2*mm))
story.append(make_table(rights_detail, [25*mm, 92*mm, 36*mm, 36*mm], small=True)); story.append(Spacer(1, 6*mm))
story.append(P('三、商务说明', H)); story.append(Spacer(1, 2*mm))
for idx, note in enumerate(notes, 1):
    story.append(P(f'{idx}. {note}', CN)); story.append(Spacer(1, 1.5*mm))
story.append(Spacer(1, 3*mm))
story.append(P('四、确认栏', H)); story.append(Spacer(1, 2*mm))
story.append(make_table(confirm, [30*mm, 65*mm, 30*mm, 65*mm]))
pdf.build(story)

README_PATH.write_text(f'''# GAP × 敦煌美术研究所 IP 联名授权报价单（70万/80万一口价）

创建时间：{quote_date_cn}

## 交付文件

- `deliverables/{DOCX_PATH.name}`
- `deliverables/{PDF_PATH.name}`

## 本版核心口径

- 两档方案：70万元一口价 / 80万元一口价。
- 授权区域：中国大陆地区及港澳地区。
- 款式数量：70万方案60个款；80万方案80个款。
- 图库授权：两档均可选择6套二创图库。
- 合作时间：12个月；清货期：6个月。
- 合作品类：服饰，包括男装、女装、男童、女童；允许礼赠品，礼赠品涉及10个品类，具体数量由客户方决定。
- 宣发支持：3次 × 2波。
- 防伪标：0.7元/个，按实际使用数量另行结算。
- 开发时间：开发期由双方协商，以最终协商结果为准。
- 活动支持：春季和秋季两个主要活动方案；二三线城市非重点门店使用 take down 版方案。

## 来源

基于用户2026-06-08口述权益信息重新制作，参考上一版GAP × 敦煌美术研究所报价单的商务版式。
''', encoding='utf-8')

# ---------- verify ----------
for p in [DOCX_PATH, PDF_PATH, README_PATH]:
    assert p.exists() and p.stat().st_size > 1000 if p.suffix != '.md' else p.exists()
with zipfile.ZipFile(DOCX_PATH) as z:
    xml = z.read('word/document.xml').decode('utf-8', errors='ignore')
    text = re.sub(r'<[^>]+>', '', xml)
required = ['70万元', '80万元', '中国大陆地区及港澳地区', '60个款', '80个款', '6套二创图库', '12个月', '6个月', '男装', '女装', '男童', '女童', '10个礼赠品品类', '3次 × 2波', '0.7元/个', 'take down']
missing = [x for x in required if x not in text]
if missing:
    raise SystemExit('Missing in docx: '+json.dumps(missing, ensure_ascii=False))
print(json.dumps({'docx': str(DOCX_PATH), 'docx_size': DOCX_PATH.stat().st_size, 'pdf': str(PDF_PATH), 'pdf_size': PDF_PATH.stat().st_size, 'missing': missing}, ensure_ascii=False, indent=2))
