#!/usr/bin/env python3
from pathlib import Path
import json, shutil, subprocess, re

BASE=Path('/data/video-pipeline/Channel-Loi-Co-Nhan/project')
TEMPLATE=BASE/'13062026-066-Nha-Yen-Nho-Biet-Chia-Viec-Dung-Ke-Cong'
SAFE=['#loiconhan','#xuhuong','#daolycuocsong','#trietlycuocsong','#songtute','#phucduc','#shorts']
BGM_MAIN='/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/paulyudin-sentimental-story-182512.mp3'
BGM_YT='/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Borderless-Aakash-Gandhi.mp3'
PROMPT="vertical 9:16, co phong giay vang, aged yellow parchment, ink-wash cinematic historical illustration, muted ochre brown charcoal palette, antique paper grain. Ancient Vietnamese family moral story scene: {beat}. Clear mobile composition, warm dignified family mood. Negative exclusions: no modern objects, no modern clothing, no modern house, no cars, no motorbikes, no phones, no electric lights, no plastic, no Western/European faces, no medieval European armor, no Chinese opera costume, no Japanese samurai, no fantasy armor, no sci-fi, no neon, no glossy fantasy poster, no photorealistic modern scene, no 3D/game render, no anime, no cartoon, no character sheet, no model sheet, no multiple views, no floating body parts, no watermark, no logo, no text."

def run(cmd, cwd='/data/video-pipeline/Channel-Loi-Co-Nhan'):
    print('RUN',' '.join(map(str,cmd)), flush=True)
    subprocess.check_call(list(map(str,cmd)), cwd=cwd)

def setup_project(pid, slug, title, desc, topic, scenes):
    dst=BASE/f'{pid}-{slug}'
    if not dst.exists():
        def ignore(d,names): return [n for n in names if n in {'output','audio','images','logs','subtitles','render_onepass','__pycache__'} or n.endswith('.pyc')]
        shutil.copytree(TEMPLATE,dst,ignore=ignore)
    old=str(TEMPLATE); new=str(dst); oldid=TEMPLATE.name; newid=dst.name
    for p in dst.rglob('*'):
        if p.is_file() and p.suffix in {'.py','.json','.txt','.md'}:
            try: s=p.read_text(encoding='utf-8')
            except UnicodeDecodeError: continue
            s=s.replace(old,new).replace(oldid,newid)
            s=s.replace('/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Borderless-Aakash-Gandhi.mp3', BGM_MAIN)
            s=s.replace('/data/video-pipeline/Channel-Loi-Co-Nhan/data/bgm/Alegend-Peace.mp3', BGM_MAIN)
            s=s.replace("'#loicongday'", "'#xuhuong'")
            s=re.sub(r"hashtags = \['#loiconhan', '#xuhuong'\] \+ \[\('#' \+ w\) for w in slug_words\(topic_clean\)\[:4\]\] \+ \['#trietlycuocsong', '#daolycuocsong', '#songcham', '#shorts', '#tiktokvietnam'\]", "hashtags = ['#loiconhan', '#xuhuong', '#daolycuocsong', '#trietlycuocsong', '#songtute', '#phucduc', '#shorts']", s)
            s=s.replace("hashtags.extend(['#daolycuocsong', '#trietlycuocsong', '#songtute', '#phucduc', '#shorts', '#xuhuong'])", "hashtags.extend(['#daolycuocsong', '#trietlycuocsong', '#songtute', '#phucduc', '#shorts'])")
            p.write_text(s,encoding='utf-8')
    data={'project_id':dst.name,'title':title,'target_duration_sec':{'min':160,'max':180},'style':'cổ phong, giấy vàng','metadata':{'youtube_title':title,'description':desc,'hashtags':SAFE,'topic_sentence':topic,'word_count_estimate':600},'total_scenes':14,'scenes':[]}
    for i,(summary,narration,beat) in enumerate(scenes,1):
        data['scenes'].append({'scene_id':f'scene_{i:03d}','type':'visual_beat','summary':summary,'narration':narration,'visual_beat':beat,'estimated_seconds':10 if i==14 else 9,'visual_prompt':PROMPT.format(beat=beat)})
    (dst/'script/scenes.json').write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding='utf-8')
    # YT worker variant: Borderless BGM and -yt output.
    src=dst/'scripts_worker_rebuild_strict.py'; yt=dst/'scripts_worker_rebuild_yt.py'
    s=src.read_text(encoding='utf-8').replace(BGM_MAIN,BGM_YT).replace("FINAL = PROJECT / 'output/final/final_video.mp4'", "FINAL = PROJECT / 'output/final/final_video-yt.mp4'")
    yt.write_text(s,encoding='utf-8')
    return dst

def fix_info(p):
    info=p/'output/info.json'
    data=json.loads(info.read_text(encoding='utf-8'))
    topic=(data.get('title') or data.get('upload_title') or p.name).split('|')[0].strip().rstrip('.')
    desc=data.get('description') or ''
    data['hashtags']=SAFE[:]
    data['caption']=topic+'. '+' '.join(SAFE)
    sm=data.setdefault('social_meta',{}); yt=sm.setdefault('youtube',{})
    yt.setdefault('title',data.get('upload_title') or data.get('title') or topic)
    yt['description']=(desc+'\n\n' if desc else '')+' '.join(SAFE)
    if isinstance(data.get('tags'),list): yt['tags']=data['tags'][:7]
    yt['category']=yt.get('category','Education')
    sm['tiktok']={'caption':data['caption']}
    sm['facebook_reels']={'caption':f'Cổ nhân dạy: {topic}.\n\n'+' '.join(SAFE)}
    sm['instagram_reels']={'caption':f'{topic}.\n\n'+' '.join(SAFE)}
    data['final_video']=str(p/'output/final/final_video.mp4'); data['final_video_yt']=str(p/'output/final/final_video-yt.mp4')
    data['public_link']=f'https://mediareel.pain.io.vn/Channel-Loi-Co-Nhan/project/{p.name}/output/final/final_video.mp4'; data['public_url']=data['public_link']
    data['public_link_yt']=f'https://mediareel.pain.io.vn/Channel-Loi-Co-Nhan/project/{p.name}/output/final/final_video-yt.mp4'; data['public_url_yt']=data['public_link_yt']
    data['bgm_main']=BGM_MAIN; data['bgm_yt']=BGM_YT
    info.write_text(json.dumps(data,ensure_ascii=False,indent=2),encoding='utf-8')

def produce(p):
    run(['python3',p/'scripts_complete_short_project.py'])
    run(['python3',p/'scripts_run_asr_and_build_subtitles.py'])
    run(['python3',p/'scripts_worker_rebuild_strict.py'])
    run(['python3',p/'scripts_worker_rebuild_yt.py'])
    fix_info(p)
    print('DONE_PROJECT',p, flush=True)

S67=[
('Cảm ơn giữ hơi ấm trong nhà','Cổ nhân dạy, trong một mái nhà, lời cảm ơn tuy ngắn nhưng có thể làm lòng người ấm rất lâu. Người thân giúp nhau là lẽ thường, nhưng nếu xem mọi điều là đương nhiên, phúc khí sẽ mỏng dần lúc nào không hay.','ancient Vietnamese family exchanging grateful bows beside a warm meal'),
('Đừng để người âm thầm bị quên','Có những người trong nhà lặng lẽ lo từng bữa cơm, từng áo quần, từng đêm thức muộn. Họ không đòi báo đáp lớn lao, chỉ cần được nhìn thấy. Một câu cảm ơn đúng lúc là ngọn đèn nhỏ giữ lòng người khỏi lạnh.','tired mother by clay stove receiving a warm cup of tea from family'),
('Lời cảm ơn không làm mình thấp đi','Nhiều người nghĩ người thân thì không cần khách sáo. Nhưng lễ nghĩa trong nhà không làm tình xa, mà làm tình bền. Biết cảm ơn cha mẹ, vợ chồng, anh em, là biết giữ phần kính trọng trong yêu thương.','husband and wife bowing gently to each other in old courtyard'),
('Công lao được nhớ thì oán ít sinh','Khi công lao bị quên, oán trách dễ mọc lên như cỏ dại. Khi sự vất vả được ghi nhận, lòng người tự mềm lại. Nhà yên không phải vì không ai mệt, mà vì người mệt biết mình không bị bỏ quên.','withered weeds turning to soft grass near family doorway'),
('Con cái học biết ơn từ lời cha mẹ','Trẻ nhỏ nghe người lớn cảm ơn nhau sẽ học được đạo nhà. Nếu cha cảm ơn mẹ, mẹ cảm ơn ông bà, con cái sẽ hiểu rằng yêu thương không chỉ nhận về, mà còn biết cúi đầu trước điều người khác làm cho mình.','children watching parents thank grandparents at low wooden table'),
('Một lời khen cứu một ngày mệt','Có ngày người đứng bếp chỉ cần nghe một câu cơm ngon quá, vất vả rồi. Câu ấy không tốn tiền, nhưng có thể xua tan cả ngày mệt. Người biết nói lời lành trong nhà là người biết tích phúc âm thầm.','simple dinner brightening as family praises the cook'),
('Đừng chỉ chê khi có lỗi','Trong nhà, nếu chỉ có tiếng chê khi sai, mà không có lời cảm ơn khi đúng, lòng người sẽ dần khép lại. Người thân cũng cần được động viên. Một mái nhà nhiều lời biết ơn thường ít tiếng thở dài.','closed wooden door opening as kind words glow like lantern light'),
('Biết ơn cha mẹ khi còn có thể','Cha mẹ già không cần con nói những lời lớn lao. Một câu cảm ơn cha mẹ đã vất vả, một bữa cơm ngồi cạnh, một lần đỡ tay qua bậc cửa, đều là hiếu. Đừng đợi vắng bóng rồi mới biết ơn.','adult child supporting elderly parents over stone doorstep'),
('Vợ chồng cảm ơn nhau thì tình bền','Vợ chồng ở lâu dễ quên những điều nhỏ. Quên rằng ai đó đã nhịn một câu, lo một bữa, chờ một đêm, giữ một mái nhà. Biết cảm ơn nhau thì tình không bị bụi đời phủ kín.','ancient couple sharing tea after chores, dust drifting away'),
('Anh em nhớ ơn nhau thì ít tranh','Anh em trong nhà nếu chỉ nhớ phần mình thiệt, sẽ dễ sinh hơn thua. Nếu còn nhớ lúc người kia từng đỡ mình, từng nhường mình, lòng sẽ dịu lại. Biết ơn là chiếc cầu giữ nghĩa anh em qua năm tháng.','siblings crossing small bamboo bridge together over calm stream'),
('Người làm việc nhỏ cũng đáng quý','Đừng xem việc quét sân, rửa bát, gánh nước là chuyện tầm thường. Việc nhỏ lặp lại mỗi ngày mới giữ nhà cửa yên ổn. Người biết cảm ơn những việc nhỏ là người có mắt nhìn thấy phúc thật.','hands washing bowls and sweeping courtyard in warm morning light'),
('Cảm ơn đi cùng hành động','Lời cảm ơn đẹp nhất là lời đi kèm hành động. Cảm ơn người nấu cơm thì phụ dọn mâm, cảm ơn cha mẹ thì bớt làm họ lo, cảm ơn bạn đời thì biết chia phần mệt. Lời và việc cùng đi, phúc mới sâu.','family members helping clean table after saying thanks'),
('Biết ơn làm nhà bớt lạnh','Một mái nhà thiếu lời biết ơn sẽ giống bếp tắt lửa, nhìn còn đó mà không ấm. Thêm một lời cảm ơn, thêm một ánh mắt thương, thêm một lần nhớ công nhau, bếp lửa trong lòng lại đỏ.','cold hearth rekindling as family gathers peacefully'),
('Nhà có phúc nhờ biết cảm ơn','Tiền bạc có thể mua nhiều đồ đạc, nhưng không mua được lòng biết ơn. Còn biết cảm ơn nhau, còn biết trân trọng việc nhỏ của nhau, thì tình thân còn đường ở lại. Nhà có phúc nhờ biết nói lời cảm ơn.','warm family home glowing under night sky, gratitude like lanterns')]
S68=[
('Người lớn công bằng thì nhà yên','Cổ nhân dạy, trong một nhà nhiều con cháu, điều giữ hòa khí không chỉ là của cải, mà là lòng công bằng của người lớn. Thiên vị một chút có thể gieo tủi thân rất lâu. Công bằng một chút có thể giữ nghĩa nhiều đời.','elder dividing fruit fairly among children in ancient courtyard'),
('Thiên vị làm lòng trẻ có vết','Trẻ nhỏ có thể không nói ra, nhưng chúng nhớ rất lâu ánh mắt nghiêng về ai, phần ngon dành cho ai, lời bênh vực đặt vào ai. Người lớn muốn nhà yên phải cẩn thận với những vết thương âm thầm ấy.','quiet child watching unequal bowls on low family table'),
('Thương khác nhau nhưng đừng bất công','Mỗi đứa con một tính, một nỗi khổ, một điều đáng thương. Nhưng thương riêng không có nghĩa là xử bất công. Người khôn biết nâng đỡ đứa yếu mà vẫn giữ lòng đứa khác khỏi lạnh.','parent comforting one child while holding equal rice portions for all'),
('Của chia không bằng lòng chia','Có nhà chia của rất nhiều mà vẫn sinh oán, vì lòng người thấy bị coi nhẹ. Có nhà của ít nhưng chia bằng sự sáng suốt, anh em vẫn kính nhau. Của cải chỉ là phần ngoài, công bằng mới là gốc trong.','small inheritance papers divided beside calm siblings and elder'),
('Đừng khen một người để làm đau người khác','Khen con cháu là điều tốt, nhưng khen một người bằng cách hạ người khác thì gieo mầm so sánh. Lời khen có trí làm người nghe muốn tốt hơn; lời khen thiếu trí làm anh em xa nhau.','elder praising child gently while others are included warmly'),
('Người lớn đừng mượn hiếu để ép con','Có khi người lớn nói thương nhà nhưng lại bắt một người gánh quá nhiều. Hiếu không phải để một đứa con kiệt sức thay tất cả. Công bằng là ai có sức góp sức, ai có lòng góp lòng, không ai bị đẩy thành vật hy sinh.','adult children sharing care for elderly parent equally'),
('Anh em hòa nhờ luật nhà rõ','Trong nhà, nếu việc gì cũng mập mờ, người này đoán ý, người kia tủi lòng, sớm muộn cũng sinh chuyện. Luật nhà không cần hà khắc, nhưng cần rõ ràng: việc chung cùng bàn, phần chung cùng biết.','family discussing household matters around wooden table with elder'),
('Đừng nghe một phía rồi kết tội','Người lớn thiếu công bằng thường bắt đầu từ việc chỉ nghe một phía. Một câu mách, một lời than, nếu vội tin ngay sẽ làm người khác oan. Muốn nhà yên, trước khi trách ai, hãy nghe cho đủ.','elder listening to two siblings under lantern before deciding'),
('Con dâu con rể cũng cần được công bằng','Gia đình mở rộng không chỉ có máu mủ, mà còn có người rời nhà mình để về chung mái. Nếu đối đãi lệch bên nội bên ngoại, lệch con ruột người ngoài, lòng người sẽ khó ấm. Công bằng làm người mới thành người nhà.','new daughter-in-law welcomed fairly at ancestral meal'),
('Cháu nhỏ nhìn cách người lớn xử sự','Con cháu không chỉ nghe lời dạy về đạo nghĩa, chúng nhìn cách người lớn chia phần, phân xử, bênh vực. Nếu người lớn công bằng, trẻ học được ngay thẳng. Nếu người lớn thiên vị, trẻ học được so đo.','grandchildren watching elder balance two bowls with calm face'),
('Công bằng không phải lạnh lùng','Công bằng không có nghĩa là vô tình. Công bằng là thương có lý, giúp có đường, trách có căn, bênh có đúng sai. Người công bằng vẫn mềm lòng, nhưng không để mềm lòng làm nghiêng cả mái nhà.','balanced scales beside warm family lantern, not cold judgment'),
('Xin lỗi khi đã thiên vị','Người lớn cũng có lúc sai. Nếu lỡ thiên vị, lỡ làm một đứa con tủi, dám nhận một câu cha mẹ chưa công bằng là đã cứu được nhiều oán khí. Thể diện nhỏ không quý bằng hòa khí lớn.','elder apologizing to grown child in quiet courtyard'),
('Giữ công bằng là giữ anh em','Sau này cha mẹ già đi, điều giữ anh em ngồi lại với nhau không chỉ là kỷ niệm, mà là cảm giác từng được đối xử công bằng. Lòng không quá tủi thì nghĩa còn đường quay về.','grown siblings sitting together peacefully after ancestral ceremony'),
('Nhà thịnh nhờ lòng người không lệch','Một mái nhà muốn bền, người lớn phải giữ lòng mình cho ngay. Không để thương ghét làm lệch lời nói, không để của cải làm lệch phân xử, không để đứa nào thấy mình bị bỏ rơi. Con cháu hòa thuận nhờ người lớn công bằng.','large family under warm ancestral roof, elder standing centered and fair')]

projects=[('13062026-067','Nha-Co-Phuc-Nho-Biet-Noi-Loi-Cam-On','Nhà có phúc nhờ biết nói lời cảm ơn | Lời cổ nhân dạy','Cổ nhân dạy: nhà có phúc nhờ biết nói lời cảm ơn. Người thân càng gần càng cần được trân trọng, vì một lời biết ơn đúng lúc có thể giữ ấm cả mái nhà.','Nhà có phúc nhờ biết nói lời cảm ơn',S67),('13062026-068','Con-Chau-Hoa-Thuan-Nho-Nguoi-Lon-Cong-Bang','Con cháu hòa thuận nhờ người lớn công bằng | Lời cổ nhân dạy','Cổ nhân dạy: con cháu hòa thuận nhờ người lớn công bằng. Trong một mái nhà, thiên vị gieo tủi thân, còn công bằng giữ nghĩa anh em qua nhiều đời.','Con cháu hòa thuận nhờ người lớn công bằng',S68)]

for spec in projects:
    p=setup_project(*spec)
    produce(p)
print('ALL_DONE')
