#!/usr/bin/env python3
from pathlib import Path
import json,re
base=Path('/data/video-pipeline/Channel-Loi-Co-Nhan')
p=base/'project/212-Giu-mot-loi-that-luc-kho-hon-tram-loi-hay-luc-yen'
topic='Giữ một lời thật lúc khó, hơn trăm lời hay lúc yên'; title=topic+' | Lời cổ nhân dạy'
for d in ['script','images/scenes','audio/voice_segments','subtitles','output/thumbnails','output/intro','logs']:(p/d).mkdir(parents=True,exist_ok=True)
scenes=[
('scene_001','Cổ nhân dạy, giữ một lời thật lúc khó, hơn trăm lời hay lúc yên. Khi đời thuận, ai cũng có thể nói điều đẹp; đến lúc gió ngược mới biết miệng người có còn đi cùng lương tâm hay không.','người xưa đứng trước ngọn gió lớn, tay giữ cuộn giấy lời hứa'),
('scene_002','Ở làng dệt ven sông có người thợ tên Tín. Ông nổi tiếng khéo tay, vải dệt mịn như mặt nước mùa thu. Khách quý thường đặt hàng trước, vì tin lời hẹn của ông hơn tin giấy đóng dấu. Trẻ nhỏ trong làng còn bảo, lời ông nói ra giống sợi chỉ đã buộc nút, không dễ tuột.','người thợ dệt cổ bên khung cửi và cuộn vải đẹp'),
('scene_003','Một năm nước lũ dâng cao, tằm chết nhiều, sợi tơ khan hiếm. Đúng lúc ấy, Tín còn nợ một đơn vải cưới cho cô gái nghèo trong làng. Nhà gái đã bán đôi vòng bạc để đặt trước tiền công.','nước lũ ngoài làng, cô gái nghèo trao vòng bạc đặt vải cưới'),
('scene_004','Một thương lái giàu tìm đến, trả giá gấp ba nếu Tín giao hết phần tơ tốt cho ông ta trước. Người ấy nói, cô gái nghèo có chậm vài tháng cũng chẳng dám trách. Túi bạc đặt trên bàn sáng lạnh dưới đèn. Tiếng bạc va nhau nghe vui tai, nhưng trong lòng ông lại nặng như đá.','thương lái đặt túi bạc cạnh sợi tơ trong xưởng dệt'),
('scene_005','Tín nhìn khung cửi trống mà lòng dao động. Mẹ bệnh cần thuốc, mái nhà dột cần sửa. Nếu nhận bạc, khó khăn trước mắt nhẹ đi. Nhưng lời hẹn với người nghèo sẽ thành món nợ không nhìn thấy.','người thợ dệt suy tư bên khung cửi trống trong đêm'),
('scene_006','Đêm ấy, ông mở hòm cũ, thấy tấm vải cha để lại. Trên mép vải có dòng chữ nhỏ: người làm nghề có thể thiếu lụa, nhưng đừng thiếu chữ tín. Tín ngồi rất lâu, nghe tiếng mưa rơi trên mái rách. Ông hiểu mái nhà có thể vá bằng tranh, còn danh dự rách thì khó vá bằng lời xin lỗi.','tấm vải cũ có dòng chữ bên đèn dầu, người thợ lặng nhìn'),
('scene_007','Sáng hôm sau, ông trả lại túi bạc cho thương lái. Ông nói phần tơ tốt đã có lời hẹn trước, nghèo cũng không nên lấy lời thật đem bán. Thương lái cười nhạt, bảo ông dại giữa thời khó.','người thợ dệt trả túi bạc cho thương lái trước cửa xưởng'),
('scene_008','Tín không cãi. Ông gom từng sợi tơ còn lại, thức nhiều đêm dệt chậm hơn, cẩn thận hơn. Bàn tay nứt vì nước lạnh, nhưng từng đường vải vẫn ngay ngắn như lời ông đã hứa. Mỗi nhịp thoi qua lại như nhắc ông giữ lòng cho thẳng.','người thợ dệt thức đêm bên khung cửi, tay nứt lạnh'),
('scene_009','Ngày giao vải, cô gái nghèo cúi đầu rơi nước mắt. Tấm vải không lộng lẫy nhất chợ, nhưng sạch, bền và đúng hẹn. Mẹ cô nói, nhà nghèo không sợ vải ít, chỉ sợ gặp người đổi lời.','cô gái nghèo nhận tấm vải cưới giản dị mà xúc động'),
('scene_010','Chuyện ấy lan ra. Người trong vùng tìm đến Tín không chỉ vì vải đẹp, mà vì biết trong xưởng nhỏ ấy, lời nói không bị cân bằng bạc. Khung cửi nghèo bỗng thành nơi người ta gửi niềm tin.','xưởng dệt nhỏ đông khách, ánh nắng trên các cuộn vải'),
('scene_011','Mẹ Tín sau đó cũng có thuốc. Một người khách từng nghe chuyện đã đem thảo dược đến, nói người giữ lời cho kẻ yếu đáng được đời giữ lại. Tín nhận thuốc mà mắt đỏ, hiểu phúc không đi bằng đường tắt.','người khách trao gói thuốc cho mẹ già trong xưởng dệt'),
('scene_012','Đời người ai cũng có lúc bị cái khó ép sát: thiếu tiền, thiếu đường, thiếu người chống đỡ. Chính lúc ấy, một lời thật mới có trọng lượng. Lời hay khi yên giống hoa trên bàn; lời thật khi khó giống cột chống mái nhà. Hoa tàn còn trồng lại được, cột gãy thì cả nhà nghiêng.','hoa trên bàn và cột nhà gỗ trong căn nhà cổ'),
('scene_013','Giữ chữ tín không phải để được khen ngay. Có khi chỉ là để đêm xuống, ta không thấy xấu hổ với chính mình. Người có thể nghèo một mùa, nhưng nếu mất lời thật, sẽ nghèo trong mắt người đời rất lâu.','người thợ dệt ngồi bình yên dưới ánh trăng bên khung cửi'),
('scene_014','Vậy nên, lúc khó nhất, đừng vội bán lời thật để mua chút yên trước mắt. Một câu giữ đúng hẹn có thể nuôi uy tín cả đời. Giữ được lời lúc gió ngược, phúc mới theo ta qua bão.','khung cửi sáng dưới bình minh sau cơn bão, người thợ đứng bình thản')]
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,'visual_prompt':vis,'image_prompt':style+vis+'.'+neg} for sid,nar,vis in scenes]
words=sum(len(re.findall(r'[\wÀ-ỹ]+',o['narration'],re.UNICODE)) for o in objs); print(p.name,words); assert 620<=words<=660
(p/'script/scenes.json').write_text(json.dumps({'title':title,'metadata':{'project_id':p.name,'topic_sentence':topic,'thumbnail_symbol':'an ancient loom and honest promise scroll glowing in storm light'},'scenes':objs},ensure_ascii=False,indent=2),encoding='utf-8')
(p/'script/scenes_validation.json').write_text(json.dumps({'passed':True,'scene_count':14,'word_count':words},ensure_ascii=False,indent=2),encoding='utf-8')
steps=[{'step':i,'status':'completed' if i<=2 else 'pending'} for i in range(1,15)]
(p/'checklist_14_steps.json').write_text(json.dumps({'project_id':p.name,'project_name':p.name[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: {p.name}  \nTopic: {topic}  \nTitle: {title}  \nTarget: 620-660 words, about 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/211-Dung-de-mot-bat-com-hon-lam-lanh-ca-mai-nha'
for name in ['scripts_step03_04_assets_tts.py','scripts_compose_master_worker.py','scripts_run_asr_and_build_subtitles.py','scripts_generate_intro_audio.py','scripts_worker_rebuild_strict.py','scripts_worker_rebuild_yt.py']:(p/name).write_text((src/name).read_text(encoding='utf-8').replace(str(src),str(p)),encoding='utf-8')
