#!/usr/bin/env python3
from pathlib import Path
import json,re
base=Path('/data/video-pipeline/Channel-Loi-Co-Nhan')
project_id='133-Dung-De-Mot-Dong-Tien-Nho-Lam-Lech-Can-Luong-Tam'
topic='Đừng để một đồng tiền nhỏ làm lệch cân lương tâm'
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, cân lương tâm lệch không phải từ núi vàng, mà thường từ một đồng tiền nhỏ ta tự cho là không đáng kể. Việc sai càng nhỏ càng dễ nuốt, nhưng nuốt lâu ngày sẽ làm cổ họng quen vị đắng.','cái cân đồng cổ hơi nghiêng vì một đồng tiền nhỏ'),
('scene_002','Ở chợ bến sông có người bán gạo tên Bình. Ông vốn thật thà, cân đủ từng đấu, nên khách nghèo hay tìm đến. Quán nhỏ nhưng tiếng lành đi xa hơn mùi gạo mới mỗi sáng.','người bán gạo áo nâu cân gạo ở chợ bến sông'),
('scene_003','Một mùa mưa, thóc lên giá, con ốm, tiền thuốc thiếu. Người bạn hàng chỉ ông cách khoét đáy đấu đi một chút, mỗi lần đong hụt chẳng ai nhận ra, gom lại đủ qua cơn khó.','người bạn hàng thì thầm bên đấu gạo và túi thuốc'),
('scene_004','Bình nghe xong im lặng. Đêm ấy, ông cầm chiếc đấu lên soi dưới đèn dầu. Một chút gỗ bị khoét đi trông không đáng kể, nhưng trong lòng ông lại thấy như có cả cái hố sâu.','người bán gạo soi chiếc đấu dưới đèn dầu, vẻ day dứt'),
('scene_005','Sáng hôm sau, ông vẫn dùng đấu cũ. Khách đông, tay ông run, mắt cứ nhìn về phía đứa con đang ho trong nhà. Một đồng lời thêm như bàn tay kéo nhẹ, bảo ông chỉ làm một lần thôi.','người bán gạo cân gạo, phía sau nhà có đứa trẻ ốm'),
('scene_006','Khi bà góa nghèo đưa bát gạo cuối cùng, Bình bỗng dừng lại. Ông nhớ lời cha từng nói, người nghèo mất một nắm gạo là mất bữa, người bán mất một chút thật là mất đời.','bà góa nghèo cầm bát gạo, người bán gạo dừng tay'),
('scene_007','Ông đổ lại gạo cho đầy đấu, rồi tự lấy tiền nhà mua thuốc ít hơn. Vợ ông lo, nhưng không trách. Bà nói, con bệnh cần thuốc, nhưng nhà này cũng cần một người cha còn đứng thẳng.','người vợ nhìn chồng bên mâm thuốc ít ỏi, ánh đèn ấm'),
('scene_008','Tin ấy không ai biết ngay. Chợ vẫn ồn, mưa vẫn rơi, quán gạo vẫn nghèo. Nhưng từ hôm đó, Bình đặt chiếc đấu ngay trước mặt, như đặt một chiếc gương nhỏ để soi lòng mình mỗi ngày.','chiếc đấu gạo đặt trước quầy như chiếc gương đạo đức'),
('scene_009','Vài tháng sau, quan phủ kiểm cân đong trong chợ. Nhiều quán bị phạt vì đấu thiếu. Đến quán Bình, chiếc đấu cũ mòn nhưng đủ. Người ta nhìn ông khác đi, không phải vì ông giàu, mà vì ông sạch.','quan phủ kiểm chiếc đấu gạo, dân chợ đứng quanh'),
('scene_010','Khách dần kéo đến nhiều hơn. Có người bảo ông may. Bình chỉ lắc đầu. May mắn đôi khi là cái tên người đời đặt cho những lần ta âm thầm không làm điều sai khi chẳng ai nhìn.','người bán gạo lặng lẽ cân hàng cho khách đông hơn'),
('scene_011','Đứa con sau này khỏi bệnh. Lớn lên, nó hỏi cha vì sao ngày đó không kiếm thêm. Bình chỉ đưa chiếc đấu cũ, nói, cha từng suýt bán rẻ lòng mình, may còn kịp giữ lại.','cha trao chiếc đấu cũ cho con trai dưới mái nhà'),
('scene_012','Đời người có nhiều cái lệch rất nhỏ. Một lời nói quá, một khoản bớt xén, một lần giả vờ không thấy. Nhưng cân lệch quen rồi, đến lúc đặt việc lớn lên cũng không còn biết đâu là ngay.','nhiều đồng tiền nhỏ làm nghiêng cán cân cổ'),
('scene_013','Người giữ được lương tâm không phải chưa từng nghèo, chưa từng sợ, chưa từng cần tiền. Họ chỉ hiểu rằng tiền qua tay rồi hết, còn vết lệch trong lòng sẽ đi theo mình qua rất nhiều đêm tối.','người đàn ông ngồi bên cân và đèn dầu trong đêm'),
('scene_014','Vậy nên, đừng xem nhẹ một đồng tiền nhỏ nếu nó làm nghiêng điều phải. Giữ cân lòng cho thẳng, dù bữa cơm hôm nay đạm bạc, phúc ngày sau vẫn có đường tìm về cửa nhà.','cái cân cân bằng trước cửa nhà nhỏ, ánh bình minh'),
]
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':'ancient balance scale with one small coin and a bowl of rice'},'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')
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':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, about 14 scenes  \nChannel: Loi Co Nhan\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/132-Biet-Giu-Phan-Minh-Dung-Tham-Anh-Sang-Nha-Nguoi'
for name in ['scripts_complete_short_project.py','scripts_worker_rebuild_strict.py','scripts_worker_rebuild_yt.py','scripts_run_asr_and_build_subtitles.py']:
 txt=(src/name).read_text(encoding='utf-8').replace(str(src),str(p));(p/name).write_text(txt,encoding='utf-8')
print(p,words)
