# -*- coding: utf-8 -*-
"""
سازنده‌ی کیت میدانی تست UX (سند ۲۳) — docs/ux-test-kit.xlsx
اجرای مجدد:  python3 scripts/make-ux-kit.py
برگه‌ها: راهنما · مشاهده (۵ کودک × ۹ وظیفه) · صورتکها · سنجه‌ها (فرمول خودکار) · یافته→اصلاح
"""
from openpyxl import Workbook
from openpyxl.styles import Font, PatternFill, Alignment, Border, Side
from openpyxl.worksheet.datavalidation import DataValidation
from openpyxl.utils import get_column_letter

wb = Workbook()

# ─────────── سبک‌ها ───────────
H_FILL = PatternFill('solid', fgColor='1E293B')
H_FONT = Font(color='E2E8F0', bold=True, size=10, name='Vazirmatn')
TITLE_FONT = Font(bold=True, size=14, color='0F172A', name='Vazirmatn')
SUB_FONT = Font(size=9, color='64748B', name='Vazirmatn')
CELL_FONT = Font(size=10, name='Vazirmatn')
STAR_FILL = PatternFill('solid', fgColor='FEF3C7')
NOTE_FILL = PatternFill('solid', fgColor='ECFDF5')
WARN_FILL = PatternFill('solid', fgColor='FEE2E2')
THIN = Border(*[Side(style='thin', color='CBD5E1')] * 4)
CENTER = Alignment(horizontal='center', vertical='center', wrap_text=True)
RIGHT = Alignment(horizontal='right', vertical='center', wrap_text=True)


def style_header(ws, row, cols, star_cols=()):
    for c in range(1, cols + 1):
        cell = ws.cell(row=row, column=c)
        cell.fill = H_FILL
        cell.font = H_FONT
        cell.alignment = CENTER
        cell.border = THIN
        if c in star_cols:
            cell.fill = PatternFill('solid', fgColor='92400E')


def set_rtl(ws):
    ws.sheet_view.rightToLeft = True


# ═══════════ برگه ۱: راهنما ═══════════
ws = wb.active
ws.title = 'راهنما'
set_rtl(ws)
ws['A1'] = '🧪 کیت میدانی تست UX — الفباز (پروتکل سند ۲۳ · نسخه 1.10.0)'
ws['A1'].font = TITLE_FONT
guide = [
    '',
    'پیش از هر جلسه: نسخه‌ی زنده (/healthz سبز) · پروفایل تازه مرورگر · صدا روشن · برای وظیفه‌ی ۹: Chrome/Edge + اجازه‌ی میکروفون + اتاق بی‌سروصدا.',
    'متن روی کودک: «این یک بازی برای یاد گرفتن حرف‌هاست. هر کاری می‌خواهی بکن؛ فقط به من بگو چی می‌بینی و چی می‌خواستی بشه.»',
    'بین وظایف سکوت؛ فقط بعد از ۳۰ ثانیه گیرِ کامل: «هر کاری فکر می‌کنی بزن» (= کمک سطح ۱).',
    '',
    'کدهای برگه‌ی «مشاهده»:',
    '   S = خودش انجام داد · H1 = با راهنمایی کلامی · H2 = با نشان‌دادن · F = نشد · N/A-م = مشکل محیطی (تقصیر کودک نیست)',
    'وظایف ⭐ (کلیدی): ۳ واژه‌سنجی · ۵ داستان · ۶ شمارنده · ۸ گیت · ۹ بلند بگو — صورتک بعد از هر کدام + پایان.',
    '',
    'برگه‌ی «سنجه‌ها» خودکار پر می‌شود — فقط برگه‌های «مشاهده» و «صورتکها» را پر کنید.',
    'قاعده‌ی N/A محیطی وظیفه‌ی ۹: اگر میکروفون/شبکه اجازه نداد، K آن کودک = N/A-م (سنجه‌ی S خودش به مبنای ۱۵ برمی‌گردد).',
    '',
    'آستانه‌های قبولی: S در ⭐ها ≥ ۲۰/۲۵ (یا ≥ ۱۲/۱۵ با N/A-م) · عبور از گیت ۰/۵ · میانه‌ی اولین ستاره ≤ ۳ دقیقه ·',
    'فهم شمارنده ≥ ۳/۵ · تلاش دوباره‌ی «بلند بگو» ≥ ۳/۵ · صورتک نهایی بدون 😖/😐 · ترک قبل از وظیفه‌ی ۶ ≤ ۱ جلسه.',
]
for i, line in enumerate(guide, start=2):
    ws.cell(row=i, column=1, value=line).font = SUB_FONT if line.startswith('   ') else CELL_FONT
ws.column_dimensions['A'].width = 110

# ═══════════ برگه ۲: مشاهده ═══════════
ws = wb.create_sheet('مشاهده')
set_rtl(ws)
ws['A1'] = 'چک‌لیست مشاهده — هر کودک یک ردیف (S/H1/H2/F/N/A-م)'
ws['A1'].font = TITLE_FONT
ws['A2'] = 'ستون‌های طلایی = وظایف ⭐ · L/M/N/O/P را هم همان جلسه پر کنید (خوراک سنجه‌ها)'
ws['A2'].font = SUB_FONT

headers = ['کودک', 'سن', '۱ بوت', '۲ بازی', '۳ واژه‌سنجی ⭐', '۴ گالری', '۵ داستان ⭐',
           '۶ شمارنده ⭐', '۷ دوباره‌خوانی', '۸ گیت ⭐', '۹ بلند بگو ⭐',
           'عبور از گیت؟', 'اولین ستاره (دقیقه)', 'شمارنده را فهمید؟', 'تلاش دوباره‌ی ۹؟',
           'ترک در وظیفه‌ی #', 'یادداشت آزاد']
HR = 4
for c, h in enumerate(headers, start=1):
    ws.cell(row=HR, column=c, value=h)
style_header(ws, HR, len(headers), star_cols=(5, 7, 8, 10, 11))
for r in range(HR + 1, HR + 6):
    ws.cell(row=r, column=1, value=f'ک{r - HR}').font = Font(bold=True, size=10, name='Vazirmatn')
    for c in range(1, len(headers) + 1):
        cell = ws.cell(row=r, column=c)
        cell.border = THIN
        cell.alignment = CENTER if c > 1 else RIGHT
        cell.font = CELL_FONT
        if c in (5, 7, 8, 10, 11):
            cell.fill = STAR_FILL

dv_code = DataValidation(type='list', formula1='"S,H1,H2,F,N/A-م"', allow_blank=True,
                         promptTitle='کد مشاهده', prompt='S=خودش · H1=راهنمایی کلامی · H2=نشان‌دادن · F=نشد · N/A-م=مشکل محیطی')
dv_yn = DataValidation(type='list', formula1='"بله,خیر"', allow_blank=True)
dv_star = DataValidation(type='list', formula1='"S,H1,H2,F,N/A-م"', allow_blank=True)
ws.add_data_validation(dv_code)
ws.add_data_validation(dv_yn)
ws.add_data_validation(dv_star)
dv_code.add(f'C{HR+1}:K{HR+5}')
dv_yn.add(f'L{HR+1}:L{HR+5}')
dv_yn.add(f'N{HR+1}:O{HR+5}')
widths = [8, 6, 9, 9, 12, 9, 11, 12, 12, 10, 12, 11, 13, 13, 13, 11, 42]
for c, w in enumerate(widths, start=1):
    ws.column_dimensions[get_column_letter(c)].width = w
ws.freeze_panes = f'C{HR+1}'

# ═══════════ برگه ۳: صورتکها ═══════════
ws = wb.create_sheet('صورتکها')
set_rtl(ws)
ws['A1'] = 'صورتک‌سنج کودک (Smileyometer) — بعد از هر وظیفه‌ی ⭐ و در پایان'
ws['A1'].font = TITLE_FONT
ws['A2'] = 'سؤال: «این بازی چه شکلی بود؟» → بد / کمی بد / کمی خوب / خوب / خیلی خوب'
ws['A2'].font = SUB_FONT
sm_headers = ['کودک', '۳ واژه‌سنجی', '۵ داستان', '۶ شمارنده', '۸ گیت', '۹ بلند بگو', 'نهایی (کلی)']
HR2 = 4
for c, h in enumerate(sm_headers, start=1):
    ws.cell(row=HR2, column=c, value=h)
style_header(ws, HR2, len(sm_headers))
for r in range(HR2 + 1, HR2 + 6):
    ws.cell(row=r, column=1, value=f'ک{r - HR2}').font = Font(bold=True, size=10, name='Vazirmatn')
    for c in range(1, len(sm_headers) + 1):
        cell = ws.cell(row=r, column=c)
        cell.border = THIN
        cell.alignment = CENTER
        cell.font = CELL_FONT
dv_sm = DataValidation(type='list', formula1='"بد,کمی بد,کمی خوب,خوب,خیلی خوب"', allow_blank=True,
                       promptTitle='صورتک', prompt='😖 بد · 😐 کمی بد · 😊 کمی خوب · 😄 خوب · 🤩 خیلی خوب')
ws.add_data_validation(dv_sm)
dv_sm.add(f'B{HR2+1}:G{HR2+5}')
for c in range(1, 8):
    ws.column_dimensions[get_column_letter(c)].width = 14
ws.freeze_panes = f'B{HR2+1}'

# ═══════════ برگه ۴: سنجه‌ها (خودکار) ═══════════
ws = wb.create_sheet('سنجه‌ها')
set_rtl(ws)
ws['A1'] = 'سنجه‌ها و آستانه‌ی قبولی — خودکار از برگه‌های مشاهده/صورتکها'
ws['A1'].font = TITLE_FONT
HR3 = 3
m_headers = ['#', 'سنجه', '—', 'مقدار (خودکار)', 'آستانه', 'حکم (خودکار)']
for c, h in enumerate(m_headers, start=1):
    ws.cell(row=HR3, column=c, value=h)
style_header(ws, HR3, len(m_headers))

OBS, SM = "'مشاهده'", "'صورتکها'"  # کوتیشن برای سازگاری فرمول با نام برگه‌ی فارسی در اکسل
rows = [
    ('S در ⭐ها (۳،۵،۶،۸،۹) — مبنای کامل',
     f'=COUNTIF({OBS}!E5:E9,"S")+COUNTIF({OBS}!G5:G9,"S")+COUNTIF({OBS}!H5:H9,"S")+COUNTIF({OBS}!J5:J9,"S")+COUNTIF({OBS}!K5:K9,"S")',
     '≥ 20 از 25',
     f'=IF(COUNTIF({OBS}!K5:K9,"N/A-م")=0,IF(D{HR3+1}>=20,"قبول","مردود"),"— با N/A-م رجوع به ردیف ۲")'),
    ('S در ⭐ها — وقتی وظیفه‌ی ۹ با N/A-م افتاده',
     f'=COUNTIF({OBS}!E5:E9,"S")+COUNTIF({OBS}!G5:G9,"S")+COUNTIF({OBS}!H5:H9,"S")+COUNTIF({OBS}!J5:J9,"S")',
     '≥ 12 از 15',
     f'=IF(COUNTIF({OBS}!K5:K9,"N/A-م")>0,IF(D{HR3+2}>=12,"قبول","مردود"),"— بدون N/A-م")'),
    ('عبور کودک از گیت والدین (باید صفر باشد)',
     f'=COUNTIF({OBS}!L5:L9,"بله")', '= 0',
     f'=IF(D{HR3+3}=0,"قبول","مردود")'),
    ('میانه‌ی زمان اولین ستاره (دقیقه)',
     f'=IFERROR(MEDIAN({OBS}!M5:M9),"—")', '≤ 3',
     f'=IF(COUNT({OBS}!M5:M9)=0,"—",IF(D{HR3+4}<=3,"قبول","مردود"))'),
    ('تفسیر خود‌انگیخته‌ی شمارنده‌ی قصه‌ها',
     f'=COUNTIF({OBS}!N5:N9,"بله")', '≥ 3 از 5',
     f'=IF(D{HR3+5}>=3,"قبول","مردود")'),
    ('تلاش دوباره‌ی خودانگیخته در «بلند بگو»',
     f'=COUNTIF({OBS}!O5:O9,"بله")', '≥ 3 از 5',
     f'=IF(D{HR3+6}>=3,"قبول","مردود")'),
    ('صورتک نهایی بد/کمی بد (باید صفر باشد)',
     f'=COUNTIF({SM}!G5:G9,"بد")+COUNTIF({SM}!G5:G9,"کمی بد")', '= 0',
     f'=IF(D{HR3+7}=0,"قبول","مردود")'),
    ('ترک جلسه قبل از وظیفه‌ی ۶',
     f'=SUMPRODUCT(({OBS}!P5:P9<>"")*({OBS}!P5:P9<6))', '≤ 1',
     f'=IF(D{HR3+8}<=1,"قبول","مردود")'),
]
for i, (name, val, thr, verdict) in enumerate(rows, start=1):
    r = HR3 + i
    ws.cell(row=r, column=1, value=i).alignment = CENTER
    ws.cell(row=r, column=2, value=name).alignment = RIGHT
    ws.cell(row=r, column=3, value='').alignment = CENTER   # C توضیح
    ws.cell(row=r, column=4, value=val).alignment = CENTER  # D مقدار (فرمول)
    ws.cell(row=r, column=5, value=thr).alignment = CENTER
    ws.cell(row=r, column=6, value=verdict).alignment = CENTER
    for c in range(1, 7):
        ws.cell(row=r, column=c).border = THIN
        ws.cell(row=r, column=c).font = CELL_FONT
ws.cell(row=HR3 + len(rows) + 2, column=2, value='حکم نهایی تست:').font = Font(bold=True, size=12, name='Vazirmatn')
final = f'=IF(COUNTIF(F{HR3+1}:F{HR3+8},"مردود")=0,"✅ قبول","⚠️ مردود — ردیف‌های «مردود» را ببین")'
ws.cell(row=HR3 + len(rows) + 2, column=4, value=final).font = Font(bold=True, size=12, color='059669', name='Vazirmatn')
ws.column_dimensions['A'].width = 5
ws.column_dimensions['B'].width = 44
ws.column_dimensions['C'].width = 3
ws.column_dimensions['D'].width = 16
ws.column_dimensions['E'].width = 12
ws.column_dimensions['F'].width = 26

# ═══════════ برگه ۵: یافته→اصلاح ═══════════
ws = wb.create_sheet('یافته→اصلاح')
set_rtl(ws)
ws['A1'] = 'جدول اصلاحات (بخش ۹ سند ۲۳) — هر F یا H2 یک ردیف؛ تکرار در ≥ ۲ کودک = اولویت بالا'
ws['A1'].font = TITLE_FONT
f_headers = ['وظیفه #', 'کودک(ان)', 'رفتار دیده‌شده', 'فرضیه‌ی ریشه', 'اصلاح پیشنهادی', 'تستِ تأیید', 'وضعیت']
HR4 = 3
for c, h in enumerate(f_headers, start=1):
    ws.cell(row=HR4, column=c, value=h)
style_header(ws, HR4, len(f_headers))
dv_status = DataValidation(type='list', formula1='"پیشنهاد,پذیرفته,اصلاح شد,رد شد"', allow_blank=True)
ws.add_data_validation(dv_status)
dv_status.add(f'G{HR4+1}:G{HR4+25}')
for r in range(HR4 + 1, HR4 + 26):
    for c in range(1, len(f_headers) + 1):
        cell = ws.cell(row=r, column=c)
        cell.border = THIN
        cell.alignment = RIGHT
        cell.font = CELL_FONT
for c, w in enumerate([9, 12, 34, 30, 34, 28, 12], start=1):
    ws.column_dimensions[get_column_letter(c)].width = w

wb.save('docs/ux-test-kit.xlsx')
print('✓ docs/ux-test-kit.xlsx ساخته شد — ۵ برگه: راهنما · مشاهده · صورتکها · سنجه‌ها · یافته→اصلاح')
