#!/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-068-Con-Chau-Hoa-Thuan-Nho-Nguoi-Lon-Cong-Bang'
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):
    print('RUN',' '.join(map(str,cmd)), flush=True)
    subprocess.check_call(list(map(str,cmd)), cwd='/data/video-pipeline/Channel-Loi-Co-Nhan')

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')
    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)

S69=[
('Lời hứa nhỏ giữ lòng tin lớn','Cổ nhân dạy, trong nhà, chữ tín không nằm ở chuyện lớn lao, mà bắt đầu từ lời hứa nhỏ. Đã nói sẽ về ăn cơm thì cố về, đã hứa giúp một việc thì nhớ làm. Giữ lời là giữ lòng người thân khỏi lạnh.','ancient Vietnamese father returning home on time as family waits by meal'),
('Đừng hứa cho yên chuyện rồi quên','Có người hứa chỉ để người khác hết buồn, sau đó lại quên như gió thoảng. Một lần quên còn có thể tha thứ, nhiều lần quên sẽ làm lòng tin rạn nứt. Người thân đau nhất khi bị xem nhẹ bởi lời hứa.','cracked clay bowl beside forgotten family promise scroll'),
('Con trẻ học chữ tín từ cha mẹ','Trẻ nhỏ nhớ rất kỹ điều người lớn đã nói. Một lần cha mẹ hứa rồi làm, con học được tin. Một lần hứa rồi bỏ, con học được nghi ngờ. Muốn con sống có tín, trước hết người lớn phải giữ lời với con.','child holding small wooden toy promised by parent in warm courtyard'),
('Vợ chồng giữ lời thì lòng yên','Vợ chồng sống lâu cần nhiều hơn tình cảm ban đầu. Cần những lời đã hứa được giữ qua tháng năm: hứa cùng lo nhà, hứa bớt nóng giận, hứa không bỏ mặc nhau khi mệt. Giữ được lời nhỏ, nghĩa lớn mới bền.','ancient couple tying simple knot cord as promise under lantern'),
('Lời thất hứa làm nhà nhiều nghi ngờ','Một mái nhà có quá nhiều lời thất hứa sẽ sinh ra thói quen nghi ngờ. Ai nói gì cũng bị hỏi lại, ai hứa gì cũng không còn ai tin. Khi lòng tin mất, nói nhiều cũng khó vá.','family silhouettes separated by thin cracks in paper wall'),
('Đừng dùng việc bận để trốn trách nhiệm','Ai cũng có lúc bận, nhưng bận không nên thành cái cớ để quên mãi lời đã hứa. Nếu không làm được, hãy nói sớm một câu. Thành thật nhận phần chưa trọn còn hơn im lặng làm người nhà chờ đợi.','busy traveler stopping to send honest message by old messenger boy'),
('Một câu xin lỗi cứu lại chữ tín','Khi lỡ thất hứa, điều cần nhất không phải chống chế, mà là nhận lỗi. Một câu xin lỗi thật lòng, kèm hành động bù lại, có thể cứu lại phần tín đã sứt. Người có phúc biết sửa lời mình.','person bowing apologetically before family with repaired clay cup'),
('Hứa ít làm nhiều là phúc','Người khôn không hứa cho to để lấy lòng. Họ hứa vừa sức, rồi làm cho trọn. Trong nhà, người hứa ít mà làm nhiều khiến ai cũng yên tâm; người nói hay mà làm thiếu khiến ai cũng mỏi lòng.','modest elder quietly completing household task before sunrise'),
('Giữ lời với cha mẹ khi còn kịp','Có người hứa với cha mẹ rằng hôm nào sẽ về, hôm nào sẽ gọi, hôm nào sẽ ngồi ăn một bữa. Rồi lần lữa mãi. Cha mẹ già không đợi được quá lâu. Chữ tín với cha mẹ là hiếu khi còn kịp.','elderly parents waiting beside open gate as grown child returns'),
('Anh em có tín thì dễ nhờ cậy','Anh em trong nhà nếu đã hứa giúp nhau thì nên giữ. Không phải vì món nợ, mà vì nghĩa. Một lần đứng bên nhau lúc khó, tình anh em sâu hơn nhiều lời hỏi han lúc thuận.','siblings helping repair broken cart on village road'),
('Đừng lấy thân quen làm lý do xuề xòa','Nhiều người giữ lời với người ngoài rất kỹ, nhưng với người nhà lại xuề xòa. Chính vì là người nhà mới càng cần trân trọng. Người ngoài mất lòng còn xa, người nhà mất lòng thì lạnh cả mái hiên.','two doors, outsider formal promise and family neglected promise contrasted'),
('Lòng tin tích từng ngày','Chữ tín trong nhà không xây trong một ngày. Nó được tích từ việc đúng giờ, nhớ lời, làm điều đã nói, bù điều đã thiếu. Từng viên nhỏ ấy xây thành bức tường che gió cho gia đình.','family building small brick wall of trust around warm home'),
('Khi đã giữ lời, nói ít cũng nặng','Người có chữ tín không cần nói nhiều. Chỉ một câu của họ cũng khiến người nhà an tâm, vì mọi người biết lời ấy có gốc. Gia đình có một người giữ tín là có một cây cột vững giữa nhà.','solid wooden pillar in ancient house glowing with family trust'),
('Nhà bền nhờ lời nói có trọng lượng','Tiền của có thể làm nhà cao, nhưng chữ tín mới làm nhà vững. Còn biết giữ lời với nhau, còn biết xin lỗi khi lỡ hẹn, còn biết làm điều đã nói, thì lòng tin còn ở lại. Nhà bền nhờ biết giữ lời hứa.','warm ancestral home standing firm under night rain')]
S70=[
('Nhường phần hơn giữ nghĩa anh em','Cổ nhân dạy, anh em trong nhà muốn bền lâu thì đừng tranh phần hơn đến cùng. Có khi nhường một chút của cải, một chút danh tiếng, một chút lời phải, lại giữ được nghĩa tình nhiều năm.','ancient Vietnamese siblings sharing rice and cloth fairly with gentle smiles'),
('Tranh hơn làm tình thân mỏng','Một miếng ngon, một phần đất, một lời khen, nếu ai cũng giành về mình, tình thân sẽ mỏng như tờ giấy. Thắng được phần hơn mà mất lòng anh em, cái thắng ấy hóa ra rất đắt.','siblings pulling at small parcel while family paper screen tears'),
('Nhường không phải yếu','Người biết nhường trong nhà không phải người thua kém. Họ hiểu rằng nghĩa thân lớn hơn một lần hơn thua. Nhường đúng lúc là trí tuệ, vì giữ được hòa khí mà tiền bạc không mua nổi.','elder sibling calmly offering larger fruit to younger sibling'),
('Cha mẹ vui khi con biết nghĩ cho nhau','Cha mẹ già không mong con cái đem nhiều của về bằng mong con cái hòa thuận. Thấy anh nhường em, em kính anh, cha mẹ nhẹ lòng hơn mọi món quà. Phúc của cha mẹ nằm trong sự êm ấm của con cháu.','elderly parents smiling as siblings help each other at courtyard meal'),
('Đừng đếm từng phần trong nhà','Có người trong nhà việc gì cũng đếm, phần này của tôi, phần kia của anh, ai được hơn ai. Đếm quá kỹ thì nghĩa tình hao hụt. Người có phúc biết phần nào nên rõ, phần nào nên rộng lòng.','old abacus set aside beside shared family goods'),
('Nhường lời cũng là nhường phúc','Không chỉ của cải mới cần nhường. Có lúc nhường một câu nói, bớt một lời hơn thua, dừng một lần cãi vã cũng là giữ phúc. Lời nói thắng trận có thể làm lòng người thân thua đau.','two siblings lowering voices under warm lantern light'),
('Người được nhường phải biết nhớ ơn','Nhường chỉ bền khi người được nhường biết trân trọng. Nếu xem sự nhường nhịn là đương nhiên, lòng người nhường sẽ lạnh. Anh em muốn lâu dài, một bên biết nhường, một bên biết nhớ.','younger sibling bowing gratefully to elder beside village path'),
('Đừng để dâu rể kéo lệch nghĩa anh em','Khi anh em lập gia đình riêng, lời của người bên cạnh có thể làm lòng nghiêng lệch. Người khôn biết nghe nhưng không để ai xúi mình quên nghĩa ruột thịt. Nhà lớn yên khi nhà nhỏ biết giữ chừng mực.','two married siblings meeting respectfully between two household gates'),
('Chuyện chia phần cần nói lúc lòng yên','Những việc liên quan đến tài sản, chăm sóc cha mẹ, việc chung trong họ, nên nói lúc lòng còn yên. Đợi đến khi giận mới bàn, lời nào cũng thành dao. Công khai, rõ ràng, mềm mỏng thì ít sinh oán.','family meeting calmly with papers and tea under ancestral altar'),
('Anh lớn đừng cậy lớn, em nhỏ đừng cậy thương','Anh lớn nếu cậy mình lớn mà ép em, sẽ mất kính trọng. Em nhỏ nếu cậy được thương mà lấn anh, sẽ mất tình nghĩa. Mỗi người biết giữ phần đạo của mình, anh em mới thuận.','elder and younger siblings standing balanced on stone bridge'),
('Nhường phần khó mới đáng quý','Nhường khi dư dả thì dễ, nhường lúc mình cũng cần mới đáng quý. Nhưng không phải nhường mù quáng, mà là biết cân nghĩa nặng nhẹ. Có những phần nhường đi, sau này đổi lại là lòng tin.','sibling sharing last bundle of grain during hard season'),
('Đừng mang chuyện cũ ra tính mãi','Anh em sống lâu khó tránh lúc va chạm. Nếu chuyện cũ cứ bị nhắc lại mỗi lần chia phần, lòng sẽ không bao giờ yên. Muốn đi tiếp, có lúc phải gấp sổ cũ lại để giữ đường về.','old grievance scroll being tied closed beside family doorway'),
('Nghĩ đến đời sau mà bớt tranh','Con cháu nhìn cách cha chú đối xử với nhau. Nếu đời trước tranh giành, đời sau học chia rẽ. Nếu đời trước biết nhường, đời sau còn biết gọi nhau là họ hàng. Một bước nhường hôm nay giữ đường thân ngày mai.','children watching uncles share land boundary peacefully'),
('Anh em bền nhờ biết nhường phần hơn','Của cải rồi cũng đổi chủ, lời thắng thua rồi cũng tan, nhưng nghĩa anh em nếu mất thì khó tìm lại. Biết nhường phần hơn, biết nhớ ơn phần được nhường, biết đặt tình trên lợi, thì anh em còn bền.','peaceful siblings walking home together under ancestral roof sunset')]
projects=[('13062026-069','Nha-Ben-Nho-Biet-Giu-Loi-Hua','Nhà bền nhờ biết giữ lời hứa | Lời cổ nhân dạy','Cổ nhân dạy: nhà bền nhờ biết giữ lời hứa. Trong gia đình, lời đã nói nếu được làm cho trọn sẽ giữ lòng tin, giữ hơi ấm và giữ phúc lâu dài.','Nhà bền nhờ biết giữ lời hứa',S69),('13062026-070','Anh-Em-Ben-Nho-Biet-Nhuong-Phan-Hon','Anh em bền nhờ biết nhường phần hơn | Lời cổ nhân dạy','Cổ nhân dạy: anh em bền nhờ biết nhường phần hơn. Tranh được một phần lợi mà mất nghĩa thân thì cái được ấy rất đắt.','Anh em bền nhờ biết nhường phần hơn',S70)]
for spec in projects:
    p=setup_project(*spec)
    produce(p)
print('ALL_DONE')
