#!/usr/bin/env python3
from pathlib import Path
import json, re, shutil
base=Path('/data/video-pipeline/Channel-Loi-Co-Nhan')
proj_root=base/'project'
project_id='127-Giu-Mieng-Khi-Gian-Phuc-Khong-Roi-Khoi-Cua'
topic='Giữ miệng khi giận, phúc không rời khỏi cửa'
title=topic+' | Lời cổ nhân dạy'
p=proj_root/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, trong lúc nóng giận mà giữ được miệng, ấy là giữ lại phúc khí cho cả một nhà. Lửa trong lòng bốc lên thì dễ, nhưng lời đã buông ra, dù hối cũng khó nhặt lại như tro bay trước gió.','người đàn ông áo nâu đứng trước cửa nhà, tay nắm tay áo để kìm lời giận'),
('scene_002','Ở một làng ven sông, có người thợ mộc tính ngay thẳng nhưng lời nói sắc như dao. Mỗi khi bực, ông mắng vợ con trước sân, khiến hàng xóm im lặng, còn người trong nhà cúi đầu như gặp mưa lạnh.','sân nhà quê ven sông, người thợ mộc giận dữ, vợ con cúi mặt'),
('scene_003','Ban đầu ông nghĩ mình chỉ nói thật. Nhưng nói thật mà thiếu lòng thương, cũng như chén thuốc tốt pha thêm cát, uống vào không chữa bệnh mà còn làm đau cổ họng người nghe.','bát thuốc trên bàn gỗ có cát rơi bên cạnh, ánh mắt người vợ buồn'),
('scene_004','Một hôm, đứa con trai làm gãy chiếc thước gỗ của cha. Cơn giận vừa nổi, ông quát một câu nặng nề, bảo con chỉ biết phá, sau này khó nên người. Đứa trẻ đứng chết lặng bên hiên.','đứa trẻ cầm thước gỗ gãy, người cha giơ tay trong sân cổ'),
('scene_005','Từ hôm ấy, đứa trẻ ít nói hẳn. Nó vẫn làm việc, vẫn chào cha, nhưng ánh mắt không còn chạy tới như trước. Người vợ khuyên nhỏ, ông chỉ gạt đi, nói trẻ con mau quên.','đứa trẻ lặng lẽ quét sân, người mẹ nhìn theo dưới mái tranh'),
('scene_006','Mùa đông năm đó, một bậc lão nho ghé qua đặt đóng chiếc rương. Thấy trong nhà cơm nóng mà lòng người lạnh, cụ không hỏi chuyện tiền công, chỉ chỉ vào cây đinh cong trên vách.','lão nho áo xám chỉ vào cây đinh cong trên vách nhà thợ mộc'),
('scene_007','Cụ nói, đinh đóng lệch còn có thể nhổ ra, nhưng vết trên gỗ thì vẫn còn. Lời giận cũng vậy, xin lỗi có thể kéo lời về, song dấu hằn trong lòng người thân không dễ phẳng lại.','cận cảnh ván gỗ có vết đinh hằn, lão nho trầm tĩnh giảng giải'),
('scene_008','Người thợ mộc nghe xong mới lặng. Đêm ấy, ông ra sân, nhìn từng tấm ván mình bào nhẵn, rồi nhớ đến những câu mình đã ném vào nhà như đá ném xuống giếng sâu.','người thợ mộc ngồi bên đống ván dưới trăng, vẻ hối hận'),
('scene_009','Sáng sau, con trai làm đổ chậu nước. Cơn giận lại dâng lên, nhưng ông cắn môi, nhặt khăn lau trước, rồi chỉ nói, lần sau đặt chậu sát tường, nước đổ còn múc lại được.','người cha cúi lau nước đổ, đứa trẻ ngạc nhiên nhìn cha'),
('scene_010','Đứa trẻ ngẩng đầu, như cây non gặp nắng sau nhiều ngày âm u. Người vợ trong bếp quay đi lau mắt. Hóa ra một lời nhẹ không làm mất uy, mà còn làm cửa nhà bớt lạnh.','gian bếp cổ, người mẹ xúc động, đứa trẻ mỉm cười nhẹ'),
('scene_011','Từ đó, mỗi khi giận, ông đặt chiếc thước gãy lên bàn để tự nhắc mình. Muốn sửa gỗ phải nhìn thớ gỗ, muốn sửa người phải giữ được lòng người trước đã.','chiếc thước gãy đặt trên bàn thợ mộc, bàn tay người cha dừng lại'),
('scene_012','Dân làng dần thấy nhà ấy yên hơn. Tiếng cưa vẫn vang, khói bếp vẫn bay, nhưng không còn những câu làm người nghe đỏ mặt. Phúc khí không phải vật lạ, nó ở trong hòa khí hằng ngày.','khói bếp bay trên mái nhà, gia đình cùng làm việc trong sân yên hòa'),
('scene_013','Người đời thường sợ mất tiền, mất ruộng, mất thể diện, mà ít sợ mất một tấm lòng. Nhưng có khi chỉ một câu lúc giận đã làm hao hết điều nhiều năm vun đắp.','hình ảnh đồng tiền, thửa ruộng và trái tim giấy trên bàn cổ phong'),
('scene_014','Vậy nên, khi lửa giận lên tới cổ, hãy khép miệng trước khi mở lời. Giữ được một câu nặng, là giữ được một người thân; giữ được hòa khí trong nhà, phúc sẽ không rời khỏi cửa.','cánh cửa nhà mở ra ánh sáng ấm, gia đình đứng yên bình bên nhau'),
]
style='Vertical 9:16, co phong giay vang, 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.'
scene_objs=[]
for sid, narration, visual in scenes:
    scene_objs.append({'scene_id':sid,'narration':narration,'image_prompt':style+visual+'.'+neg,'visual_prompt':visual})
scenes_json={'title':title,'metadata':{'project_id':project_id,'topic_sentence':topic},'scenes':scene_objs}
(p/'script/scenes.json').write_text(json.dumps(scenes_json,ensure_ascii=False,indent=2),encoding='utf-8')
words=sum(len(re.findall(r"[\wÀ-ỹ]+",s[1],re.UNICODE)) for s in scenes)
validation={'passed':620<=words<=660 and len(scenes)==14,'scene_count':len(scenes),'word_count':words,'checks':{'no_heading_scenes':True,'required_fields':True,'target_words_620_660':620<=words<=660}}
(p/'script/scenes_validation.json').write_text(json.dumps(validation,ensure_ascii=False,indent=2),encoding='utf-8')
steps=[]
for i in range(1,15):
    steps.append({'step':i,'status':'completed' if i<=2 else 'pending'})
check={'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}
(p/'checklist_14_steps.json').write_text(json.dumps(check,ensure_ascii=False,indent=2),encoding='utf-8')
md=f'''# Checklist 14 Steps\n\nProject ID: {project_id}  \nTopic: {topic}  \nTitle: {title}  \nTarget: 620-660 words, about 14 scenes  \nChannel: Loi Co Nhan  \nWorkflow version: v3-current-short-ai-script\n\n- Step 01: Completed\n- Step 02: Completed ({len(scenes)} scenes, {words} words)\n- Step 03: Pending\n- Step 04: Pending\n- Step 05: Pending\n- Step 06: Pending\n- Step 07: Pending\n- Step 08: Pending\n- Step 09: Pending\n- Step 10: Pending\n- Step 11: Pending\n- Step 12: Pending\n- Step 13: Pending\n- Step 14: Pending\n'''
(p/'checklist_14_steps.md').write_text(md,encoding='utf-8')
# Copy current workflow scripts and retarget project path; later steps will inspect before running.
src=proj_root/'126-Noi-Loi-That-Ma-Giu-Duoc-Long-Nguoi-Phuc-Con-O-Lai-Trong-Nha'
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']:
    sp=src/name
    if sp.exists():
        txt=sp.read_text(encoding='utf-8').replace(str(src),str(p))
        (p/name).write_text(txt,encoding='utf-8')
print(p)
print(validation)
