#!/usr/bin/env python3
from pathlib import Path
import json, re, unicodedata
base=Path('/data/video-pipeline/Channel-Loi-Co-Nhan')
projects=[]
texts=[]
for root in [base/'project', base/'project/Complete']:
    if root.exists():
        for d in root.iterdir():
            if d.is_dir():
                texts.append(d.name)
                if d.name[:3].isdigit(): projects.append(int(d.name[:3]))
                for f in [d/'output/info.json', d/'script/scenes.json']:
                    if f.exists():
                        try: texts.append(f.read_text(encoding='utf-8')[:3000])
                        except Exception: pass
reg=base/'data/topic_registry.md'
if reg.exists(): texts.append(reg.read_text(encoding='utf-8'))
existing='\n'.join(texts).lower()
topic='Biết giữ một ngọn đèn nhỏ trong lòng, đêm dài cũng có lối đi'
if topic.lower() in existing or 'ngon den nho trong long' in existing:
    raise SystemExit('Topic duplicate risk')
def slugify(s):
    s=unicodedata.normalize('NFD',s)
    s=''.join(c for c in s if unicodedata.category(c)!='Mn')
    s=s.replace('đ','d').replace('Đ','D')
    return re.sub(r'[^A-Za-z0-9]+','-',s).strip('-')
project_id=f'{max(projects)+1:03d}-'+slugify(topic)
p=base/'project'/project_id
for d in ['script','images/scenes','audio/voice_segments','subtitles','output/thumbnails','output/intro','logs']:
    (p/d).mkdir(parents=True,exist_ok=True)
title=topic+' | Lời cổ nhân dạy'
scenes=[
('scene_001','Cổ nhân dạy, biết giữ một ngọn đèn nhỏ trong lòng, đêm dài cũng có lối đi. Người đời sợ bóng tối bên ngoài, nhưng đáng sợ hơn là khi trong tâm mình tắt mất một chút thiện lương.','ngọn đèn dầu nhỏ sáng trong căn nhà cổ giữa đêm mưa'),
('scene_002','Ở một xóm ven sông có chàng thợ mộc tên Khiêm. Nhà nghèo, cha mất sớm, mẹ bệnh lâu ngày, nên anh thường đi làm khi trời chưa sáng và trở về lúc bến nước đã phủ sương.','người thợ mộc trẻ vác hộp đồ qua bến sông mờ sương'),
('scene_003','Một mùa lũ, làng mất mùa, gỗ quý khan hiếm. Có người lái buôn ghé xưởng, đưa cho Khiêm túi bạc, bảo anh tráo một cây cột kém vào nhà thờ họ mới dựng.','lái buôn áo tối đưa túi bạc trong xưởng mộc cổ'),
('scene_004','Túi bạc ấy đủ mua thuốc cho mẹ trong nhiều tháng. Khiêm cầm lên, lòng run như chiếc đèn trước gió. Nếu nhận, không ai biết ngay. Nếu từ chối, căn nhà mình vẫn lạnh.','túi bạc đặt cạnh ngọn đèn dầu, người thợ mộc do dự'),
('scene_005','Đêm đó, mẹ anh ho từng cơn. Bà nhìn ngọn đèn dầu leo lét rồi nói, nhà nghèo có thể thiếu cơm, nhưng lòng người đừng thiếu sáng. Đèn nhỏ mà giữ được, đường tối còn qua.','người mẹ già bên giường bệnh nhìn ngọn đèn dầu'),
('scene_006','Khiêm thức trắng. Anh nhớ những cột nhà từng đỡ mưa nắng cho bao gia đình. Một cây gỗ xấu đặt sai chỗ không chỉ làm nghiêng mái, mà còn làm nghiêng cả lòng tin của người làm nghề.','người thợ mộc ngồi trước bản vẽ nhà gỗ trong đêm'),
('scene_007','Sáng hôm sau, Khiêm trả lại túi bạc. Người lái buôn cười nhạt, bảo anh cố chấp thì suốt đời nghèo. Khiêm chỉ cúi đầu, nói nghèo là bóng tối ngoài cửa, gian dối mới là tắt đèn trong lòng.','người thợ mộc trả túi bạc trước cửa xưởng'),
('scene_008','Vài ngày sau, nhà thờ họ dựng xong. Khi bão lớn kéo qua, nhiều mái tranh trong làng tốc lên, nhưng căn nhà gỗ ấy vẫn đứng vững. Dân làng mới biết ai đã giữ từng cây cột ngay thẳng.','nhà gỗ cổ đứng vững trong mưa bão, dân làng che áo nhìn'),
('scene_009','Người trưởng họ tìm đến, đặt trước mặt Khiêm một khoản tiền công lớn hơn. Nhưng điều quý nhất không phải bạc, mà là câu ông nói: từ nay việc khó trong làng, cứ tìm người thợ không bán ánh đèn lòng.','trưởng họ trao tiền công trong xưởng mộc ấm sáng'),
('scene_010','Tiếng tốt lan xa. Khách tìm Khiêm vì mộng gỗ, kèo nhà, cửa bếp, nhưng ở lại vì thấy nơi anh một sự yên ổn. Người giữ được một điều nhỏ trong tối thường khiến người khác dám tin.','xưởng mộc đông khách, ánh sáng vàng trên gỗ'),
('scene_011','Mẹ Khiêm dần có thuốc. Bà không nói mình đã cứu con bằng một câu, chỉ mỗi tối châm đèn rồi để anh tự nhìn. Ngọn lửa nhỏ ấy nhắc anh rằng phúc không đến từ đường tắt.','mẹ già châm đèn, người con lặng nhìn trong căn nhà nghèo'),
('scene_012','Đời người ai cũng có đêm dài: khi túng thiếu, khi bị ép, khi thấy người khác đi nhanh nhờ lối cong. Nhưng đêm dài không làm người lạc, nếu trong lòng còn một điểm sáng để nhận ra đường thẳng.','con đường làng tối với một ngọn đèn nhỏ dẫn lối'),
('scene_013','Giữ thiện lương không phải lúc nào cũng được khen ngay. Có khi chỉ là tự không hổ thẹn khi khép cửa ngủ. Có khi là để con cháu sau này nhắc đến tên mình mà không cúi mặt.','người thợ mộc đóng cửa xưởng, bóng đèn hắt lên gương mặt bình yên'),
('scene_014','Vậy nên, lúc đời tối nhất, đừng vội bán ngọn đèn nhỏ trong lòng. Một chút ngay thẳng còn lại có thể soi qua cơn nghèo, cơn sợ, cơn tham. Đèn còn sáng, phúc còn đường về.','bình minh trên bến sông, ngọn đèn dầu vẫn sáng bên khung cửa'),
]
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]
(p/'script/scenes.json').write_text(json.dumps({'title':title,'metadata':{'project_id':project_id,'topic_sentence':topic,'thumbnail_symbol':'a small oil lamp glowing beside straight wooden pillars in a stormy ancient village'},'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')
md=f'''# Checklist 14 Steps

Project ID: {project_id}  
Topic: {topic}  
Title: {title}  
Target: 620-660 words, about 14 scenes  
Channel: Loi Co Nhan  
Workflow version: v3-current-short-ai-script

- Step 01: Completed
- Step 02: Completed (14 scenes, {words} words)
'''
md+='\n'.join([f'- Step {i:02}: Pending' for i in range(3,15)])+'\n'
(p/'checklist_14_steps.md').write_text(md,encoding='utf-8')
src=base/'project/207-Dung-De-Mot-Ngay-Muon-Ma-Thanh-Mot-Doi-Loi-Hua'
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']:
    txt=(src/name).read_text(encoding='utf-8').replace(str(src),str(p))
    (p/name).write_text(txt,encoding='utf-8')
print(project_id, words, p)
