# -*- coding: utf-8 -*-
"""01 입수 → 02 분석 → 03 결과 노트북을 순서대로 실행하고 실행 기록을 남긴다.

사용법:  python run_all.py                (스냅샷·저장된 사후 표본으로 계산, 수 분 이내)
         ONLINE=1 python run_all.py       (01에서 ECOS·FRED 재수집 비교를 추가)
         FULL=1 python run_all.py         (02에서 Octave+Dynare 재추정·전망, 약 2시간 15분)
결과   :  각 노트북이 실행 결과를 담은 채 저장되고, output/run_log.txt 에 시각·환경·소요시간이 기록된다.
"""
import os
import platform
import sys
import time

import nbformat
from nbclient import NotebookClient

HERE = os.path.dirname(os.path.abspath(__file__))
ORDER = ["01_입수.ipynb", "02_분석.ipynb", "03_결과.ipynb"]
FULL = os.environ.get("FULL", "0") == "1"
TIMEOUT = 4 * 3600 if FULL else 600        # FULL=1이면 Dynare MH 추정 셀이 2시간 넘게 걸린다


def main() -> int:
    log = [f"실행 시각: {time.strftime('%Y-%m-%d %H:%M:%S')}", f"Python {platform.python_version()} ({sys.platform})",
           f"실행 방식: ONLINE={os.environ.get('ONLINE', '0')} FULL={os.environ.get('FULL', '0')}"]
    for name in ORDER:
        path = os.path.join(HERE, name)
        nb = nbformat.read(path, as_version=4)
        t0 = time.time()
        NotebookClient(nb, timeout=TIMEOUT, kernel_name="python3", resources={"metadata": {"path": HERE}}).execute()
        nbformat.write(nb, path)
        msg = f"{name}: 완료 ({time.time() - t0:.1f}초)"
        print(msg)
        log.append(msg)
    os.makedirs(os.path.join(HERE, "output"), exist_ok=True)
    with open(os.path.join(HERE, "output", "run_log.txt"), "w", encoding="utf-8") as f:
        f.write("\n".join(log) + "\n")
    return 0


if __name__ == "__main__":
    sys.exit(main())
