#!/usr/bin/env python3
"""
cleanup-temp.py - workspace/temp/ 폴더 임시 파일 정리 스크립트

사용법:
  python3 memory/cleanup-temp.py          # 기본: 1시간 이상 된 파일 삭제
  python3 memory/cleanup-temp.py --all    # 전체 삭제
  python3 memory/cleanup-temp.py --dry    # 삭제 목록만 출력 (실제 삭제 안 함)
  python3 memory/cleanup-temp.py --age 30 # 30분 이상 된 파일 삭제

⚠️ 이 스크립트는 workspace/temp/ 폴더만 건드립니다.
   프로젝트 코드는 절대 삭제하지 않습니다.
"""

import json
import os
import sys
import time
from pathlib import Path

WORKSPACE_ROOT = Path(__file__).parent.parent
TEMP_DIR = WORKSPACE_ROOT / "temp"
DEFAULT_AGE_MINUTES = 60


def get_file_age_minutes(filepath: Path) -> float:
    """파일의 경과 시간(분) 반환"""
    mtime = filepath.stat().st_mtime
    return (time.time() - mtime) / 60


def list_temp_files(age_minutes: float = None) -> list[Path]:
    """temp 폴더의 파일 목록 반환 (age_minutes 이상 된 것만)"""
    if not TEMP_DIR.exists():
        return []

    files = []
    for f in TEMP_DIR.rglob("*"):
        if f.is_file():
            if age_minutes is None or get_file_age_minutes(f) >= age_minutes:
                files.append(f)
    return files


def cleanup(age_minutes: float = None, dry_run: bool = False) -> dict:
    """
    temp 폴더 정리
    - age_minutes=None 이면 전체 삭제
    - dry_run=True 이면 삭제 목록만 출력
    """
    if not TEMP_DIR.exists():
        TEMP_DIR.mkdir(parents=True)
        return {"status": "ok", "deleted": [], "message": "temp 폴더가 비어있음"}

    targets = list_temp_files(age_minutes)

    if not targets:
        return {"status": "ok", "deleted": [], "message": "삭제할 파일 없음"}

    deleted = []
    errors = []

    for f in targets:
        rel_path = str(f.relative_to(WORKSPACE_ROOT))
        if dry_run:
            deleted.append(rel_path)
        else:
            try:
                f.unlink()
                deleted.append(rel_path)
            except Exception as e:
                errors.append({"file": rel_path, "error": str(e)})

    # 빈 디렉토리 정리 (dry_run 아닐 때만)
    if not dry_run:
        for d in sorted(TEMP_DIR.rglob("*"), reverse=True):
            if d.is_dir() and not any(d.iterdir()):
                try:
                    d.rmdir()
                except Exception:
                    pass

    return {
        "status": "ok",
        "dry_run": dry_run,
        "deleted_count": len(deleted),
        "deleted": deleted,
        "errors": errors,
        "protected": "workspace/temp/ 외 파일은 건드리지 않음",
    }


def main():
    args = sys.argv[1:]

    dry_run = "--dry" in args
    delete_all = "--all" in args

    age_minutes = None if delete_all else DEFAULT_AGE_MINUTES

    if "--age" in args:
        idx = args.index("--age")
        try:
            age_minutes = float(args[idx + 1])
        except (IndexError, ValueError):
            print(json.dumps({"status": "error", "message": "--age 뒤에 숫자를 입력하세요 (예: --age 30)"}))
            sys.exit(1)

    result = cleanup(age_minutes=age_minutes, dry_run=dry_run)
    print(json.dumps(result, ensure_ascii=False, indent=2))


if __name__ == "__main__":
    main()
