#!/usr/bin/env python3
"""Chèn 3 cue mới (re-transcribe gap 6.4s bị sót) vào 001 + regenerate toàn bộ file.

Chỉ fix gap 1 (1908.8→1915.2s). Gap 2 (1.3s) là khoảng nghỉ tự nhiên, không chèn.

Đọc bản dịch Việt từ output/gap_retranscribe/vi.json (list 3 string).
"""
import json
import os
import re
import shutil
import time

PROJ = "/home/tuan-nguyen/.openclaw/workspace/015-phu_de_video"
OUT = os.path.join(PROJ, "output")
PREFIX = "001"

# (start_ms, end_ms, myanmar) — gap 30ms khớp file đã chuẩn hóa
NEW_CUES = [
    (1908829, 1911670, "အပ်စပ်ခံစရာ လိုတဲ့ မလိုတဲ့ ပစ္စည်းကို ကျွန်တော်တို့ နားလည်သွားပြီဆိုရင်"),
    (1911700, 1914570, "ဘယ်လိုကပ်ရမလဲဆိုတဲ့ အပိုင်းက ဒုတိယတစ်ပိုင်း ထပ်လာတာပေါ့နော်။"),
    (1914600, 1915170, "ကပ်ပုံကပ်နည်းက တစ်ပိုင်းလာမယ်။"),
]
# end-time THỰC của cue 322 (đứng trước gap 6.4s)
INSERT_AFTER_END = 1908799

TS_RE = re.compile(r'^(\d{1,2}):(\d{2}):(\d{2}),(\d{3})\s*-->\s*(\d{1,2}):(\d{2}):(\d{2}),(\d{3})$')


def to_ms(h, m, s, ms):
    return h * 3600000 + m * 60000 + s * 1000 + ms


def fmt_ms(ms):
    ms = int(round(ms))
    h = ms // 3600000; ms %= 3600000
    m = ms // 60000; ms %= 60000
    s = ms // 1000; ms %= 1000
    return f"{h:02d}:{m:02d}:{s:02d},{ms:03d}"


def parse_srt(path):
    segs = []
    for blk in open(path, encoding="utf-8").read().split("\n\n"):
        lines = blk.split("\n")
        if len(lines) < 3:
            continue
        m = TS_RE.match(lines[1].strip())
        if not m:
            continue
        g = [int(x) for x in m.groups()]
        segs.append([to_ms(g[0], g[1], g[2], g[3]), to_ms(g[4], g[5], g[6], g[7]),
                     "\n".join(lines[2:]).strip()])
    return segs


def main():
    vi_path = os.path.join(OUT, "gap_retranscribe", "vi.json")
    with open(vi_path, encoding="utf-8") as f:
        vi_list = json.load(f)
    assert len(vi_list) == len(NEW_CUES), f"vi.json {len(vi_list)} != {len(NEW_CUES)}"

    my = parse_srt(os.path.join(OUT, f"{PREFIX}_final.srt"))
    vi = parse_srt(os.path.join(OUT, f"{PREFIX}_final_vi.srt"))
    assert len(my) == len(vi), f"my={len(my)} vi={len(vi)}"

    full = [[m[0], m[1], m[2], v[2]] for m, v in zip(my, vi)]

    pos = None
    for i, c in enumerate(full):
        if abs(c[1] - INSERT_AFTER_END) <= 5:
            pos = i
            break
    assert pos is not None, f"không tìm thấy cue end≈{INSERT_AFTER_END}ms"

    group = [[s, e, my_text, vi_text]
             for (s, e, my_text), vi_text in zip(NEW_CUES, vi_list)]
    full[pos + 1:pos + 1] = group

    print(f"tổng cue sau chèn: {len(full)} (trước {len(my)})")

    def bak(p):
        b = f"{p}.bak.{time.strftime('%Y%m%d_%H%M%S')}"
        shutil.copy2(p, b)
        return b

    srt_path = os.path.join(OUT, f"{PREFIX}_final.srt")
    b = bak(srt_path)
    with open(srt_path, "w", encoding="utf-8") as f:
        for i, c in enumerate(full, 1):
            f.write(f"{i}\n{fmt_ms(c[0])} --> {fmt_ms(c[1])}\n{c[2]}\n\n")

    vi_srt = os.path.join(OUT, f"{PREFIX}_final_vi.srt")
    b2 = bak(vi_srt)
    with open(vi_srt, "w", encoding="utf-8") as f:
        for i, c in enumerate(full, 1):
            f.write(f"{i}\n{fmt_ms(c[0])} --> {fmt_ms(c[1])}\n{c[3]}\n\n")

    mp = os.path.join(OUT, f"{PREFIX}_srt_map.json")
    b3 = bak(mp)
    recs = [{"index": i + 1, "start": fmt_ms(c[0]), "end": fmt_ms(c[1]), "myanmar": c[2]}
            for i, c in enumerate(full)]
    with open(mp, "w", encoding="utf-8") as f:
        json.dump(recs, f, ensure_ascii=False, indent=2)

    ml = os.path.join(OUT, f"{PREFIX}_myanmar_lines.txt")
    with open(ml, "w", encoding="utf-8") as f:
        for i, c in enumerate(full):
            f.write(f"[{i}] {c[2]}\n")

    bl = os.path.join(OUT, f"{PREFIX}_bilingual.txt")
    with open(bl, "w", encoding="utf-8") as f:
        for i, c in enumerate(full):
            f.write(f"[{i}] {c[2]}\n")
            f.write(f"     {c[3]}\n")
            f.write("\n")

    print(f"✅ done: 001_final.srt, _vi.srt, srt_map, myanmar_lines, bilingual")
    print(f"   backups: {os.path.basename(b)}, {os.path.basename(b2)}, {os.path.basename(b3)}")


if __name__ == "__main__":
    main()
