#!/usr/bin/env python3
from pathlib import Path
import json, re
base=Path('/data/video-pipeline/Channel-Loi-Co-Nhan')
project_id='178-Dung-Lay-Luc-Gian-Lam-Thuoc-Do-Long-Nguoi'
topic='Đừng lấy lúc giận làm thước đo lòng người'
title=topic+' | Lời cổ nhân dạy'
p=base/'project'/project_id
p.mkdir(parents=True, exist_ok=True)
for d in ['script','images/scenes','audio/voice_segments','subtitles','output/thumbnails','output/intro','logs','render_onepass']:
    (p/d).mkdir(parents=True, exist_ok=True)
scenes=[('scene_001', 'Cổ nhân dạy, đừng lấy lúc giận làm thước đo lòng người. Khi mây đen kéo qua, ta không thể nói bầu trời vốn không có nắng. Một câu nóng trong phút chốc cũng vậy, nếu vội tin là thật, tình nghĩa lâu năm có thể bị cắt đứt oan uổng.', 'mây đen che mặt trời trên mái nhà cổ, người đứng lặng'), ('scene_002', 'Ở làng ven núi có hai anh em tên Phúc và An. Cha mẹ mất sớm, anh em nương nhau mà sống. Phúc giỏi làm ruộng, An khéo buôn củi, mùa nào trong sân cũng có tiếng cười và bữa cơm chung dưới ngọn đèn dầu.', 'hai anh em trong sân nhà quê cổ, bó củi và thửa ruộng xa'), ('scene_003', 'Một năm hạn lớn, lúa ngoài đồng héo vàng. Phúc vay thóc của An để gieo lại vụ sau. An gật đầu, nói anh em với nhau, khi khó thì đỡ nhau. Nhưng đến mùa thu, việc buôn củi của An thua lỗ, lòng anh cũng đầy lo lắng.', 'cánh đồng khô hạn và người em cầm bao thóc bên hiên'), ('scene_004', 'An đến nhà Phúc hỏi lại số thóc đã cho vay. Phúc vừa mất trâu, trong lòng rối bời, nghe em nhắc nợ thì đỏ mặt. Ông buột miệng nói, chú chỉ nhớ thóc, không còn nhớ tình anh em nữa sao.', 'hai anh em căng thẳng trước chum thóc và chuồng trâu trống'), ('scene_005', 'Câu ấy như chiếc gai đâm vào An. Anh giận đến run tay, đáp lại rằng, nếu anh nghĩ tôi bạc, từ nay đường ai nấy đi. Người trong nhà im bặt. Một bữa cơm đang ấm bỗng lạnh như tro tàn sau bếp.', 'mâm cơm lạnh, hai anh em quay mặt trong nhà tranh'), ('scene_006', 'An bỏ về, định chia rào ngăn lối qua sân chung. Nhưng vợ anh khuyên, lúc người ta đau, lời nói dễ méo. Đừng lấy tiếng kêu trong cơn đau mà đo cả tấm lòng trước đó. An nghe, vẫn giận, nhưng tay chưa động vào cọc rào.', 'người vợ giữ tay chồng bên những cọc tre chưa dựng'), ('scene_007', 'Đêm xuống, Phúc ngồi bên chuồng trâu trống, nhớ lại bao lần An đội mưa mang thuốc cho con mình, bao lần em nhường phần thịt ngon cho cha mẹ khi còn sống. Ông biết mình đã lấy nỗi khổ trong lòng trút lên người thân.', 'người anh ngồi hối hận bên chuồng trâu trống dưới trăng'), ('scene_008', 'Sáng hôm sau, Phúc đem một nửa số thóc còn lại sang nhà em. Ông cúi đầu nói, hôm qua anh nói lời bất nghĩa. Cơn giận là của anh, không phải tội của chú. Nếu chú còn giận, anh xin chịu.', 'người anh cúi đầu đặt bao thóc trước cửa nhà em'), ('scene_009', 'An nhìn bao thóc rồi nhìn anh. Trong lòng anh vẫn còn vết xước, nhưng nhớ lời vợ, anh không lấy một câu hôm qua để phủ hết mấy chục năm chung máu. Anh đỡ anh mình đứng dậy, rồi lặng lẽ rót chén nước.', 'người em đỡ anh đứng dậy, chén nước trên bàn gỗ'), ('scene_010', 'Từ đó, hai anh em đặt ra một lệ. Khi ai đang giận, người kia không vội kết tội, chỉ chờ qua một đêm rồi nói lại. Có những ngọn lửa nếu không thêm rơm, tự nó sẽ tàn trước khi cháy lan sang mái nhà.', 'hai anh em ngồi nói chuyện sau một đêm yên tĩnh'), ('scene_011', 'Dân làng thấy anh em không chia rào thì khen An biết nghĩ xa. An đáp, người thân cũng có ngày mệt, có lúc lỡ lời. Nếu chỉ nhìn lúc họ xấu nhất, ta sẽ quên mất bao lần họ đã tốt với mình trong âm thầm.', 'dân làng bên hàng rào tre chưa dựng, người em điềm tĩnh'), ('scene_012', 'Về sau, Phúc trả đủ thóc, còn giúp An dựng lại mái kho củi. Tình anh em không phải không có vết nứt, nhưng nhờ biết dừng tay đúng lúc, vết nứt ấy không biến thành vực sâu.', 'hai anh em sửa mái kho củi, ánh nắng sau mưa'), ('scene_013', 'Ở đời, ai cũng có lúc nói bằng vết thương thay vì bằng lòng thật. Nghe một lời nặng, hãy xét cả quãng đường người ấy từng đi cùng ta. Đừng để một phút giông tố xóa sạch những mùa nắng đã từng che chở.', 'con đường dài qua mùa nắng và cơn giông nhỏ phía xa'), ('scene_014', 'Vậy nên, khi người thân lỡ lời trong lúc giận, hãy chậm lại một nhịp. Đo lòng người bằng ngày họ sống tử tế, không phải bằng giây phút họ yếu lòng. Giữ được cách nhìn ấy, tình nghĩa mới qua khỏi mùa gió dữ.', 'bàn tay khép cánh cửa trước gió, trong nhà còn ánh đèn ấm')]
style='Vertical 9:16, cổ phong giấy vàng, aged parchment, ink-wash cinematic historical Vietnamese moral story scene, muted ochre brown sepia charcoal, dignified calm mood, one clear symbolic scene: '
neg=' Negative prompt: no modern objects, no modern clothing, no cars, no motorbikes, no phones, no electric lights, no plastic, no Western faces, no wrong culture, no fantasy, no sci-fi, no neon, no glossy 3D, no anime, no cartoon, no model sheet, no watermark, no logo, no text.'
objs=[{'scene_id':sid,'narration':nar,'image_prompt':style+vis+'.'+neg,'visual_prompt':vis} for sid,nar,vis in scenes]
(p/'script/scenes.json').write_text(json.dumps({'title':title,'metadata':{'project_id':project_id,'topic_sentence':topic,'thumbnail_symbol':'unbuilt bamboo fence and warm doorway after anger'},'scenes':objs}, ensure_ascii=False, indent=2), encoding='utf-8')
words=sum(len(re.findall(r'[\wÀ-ỹ]+', nar, re.UNICODE)) for _,nar,_ in scenes)
(p/'script/scenes_validation.json').write_text(json.dumps({'passed':620<=words<=660,'scene_count':14,'word_count':words}, ensure_ascii=False, indent=2), encoding='utf-8')
names=['Choose fresh moral topic, name project, and create project folder','Write script and split scene plan','Image preflight, 9:16 scene images, and single vertical thumbnail','Scene-level TTS','Build master narration timeline and probe durations','ASR master narration word timestamps','Map original narration to ASR word timing','Clamp subtitle safe gaps and validate no overlap','Prepare one-pass 9:16 render','Render full 9:16 main story once','Validate and QA main story video','Create one-frame thumbnail intro','Final package intro + main + BGM audio-safe','Final QA, write output/info.json, then approve output']
steps=[{'step':i,'name':name,'status':'completed' if i<=2 else 'pending'} for i,name in enumerate(names,1)]
(p/'checklist_14_steps.json').write_text(json.dumps({'project_id':project_id,'project_name':project_id[4:].replace('-',' '),'topic_sentence':topic,'title':title,'target_words':'620-660','target_scenes':14,'channel':'Loi Co Nhan','workflow_version':'v3-current-short-ai-script','current_step':3,'steps':steps}, ensure_ascii=False, indent=2), encoding='utf-8')
(p/'checklist_14_steps.md').write_text(f'# Checklist 14 Steps\n\nProject ID: {project_id}  \nTopic: {topic}  \nTitle: {title}  \nTarget: 620-660 words, 14 scenes\n\n- Step 01: Completed\n- Step 02: Completed (14 scenes, {words} words)\n'+'\n'.join([f'- Step {i:02}: Pending' for i in range(3,15)])+'\n', encoding='utf-8')
src=base/'project/177-Giu-Mot-Ngay-Khong-Oan-Tranh-Duoc-Muoi-Nam-Hoi-Tiec'
for name in ['scripts_step03_04_assets_tts.py','scripts_compose_master_worker.py','scripts_run_asr_and_build_subtitles.py','scripts_worker_rebuild_strict.py','scripts_worker_rebuild_yt.py','scripts_generate_intro_audio.py']:
    txt=(src/name).read_text(encoding='utf-8').replace(str(src), str(p)).replace("Path('/data/video-pipeline/Channel-Loi-Co-Nhan/project/161-Giu-Mot-Loi-Dong-Vien-Con-Cai-Vung-Qua-Ngay-Kho')", f"Path('{p}')")
    (p/name).write_text(txt, encoding='utf-8')
print(p)
print(words)
