#!/usr/bin/env python3
"""
버전 관리 도우미 스크립트
app.exe 빌드 후 version.json 파일을 자동으로 업데이트합니다.
"""

import json
import hashlib
import os
import sys
from datetime import datetime

def calculate_file_hash(filepath):
    """파일의 SHA256 해시 계산"""
    if not os.path.exists(filepath):
        return None
    
    sha256_hash = hashlib.sha256()
    with open(filepath, "rb") as f:
        for byte_block in iter(lambda: f.read(4096), b""):
            sha256_hash.update(byte_block)
    return sha256_hash.hexdigest()

def get_file_size(filepath):
    """파일 크기 반환"""
    if not os.path.exists(filepath):
        return 0
    return os.path.getsize(filepath)

def load_version_template():
    """버전 템플릿 로드"""
    template_file = "version_template.json"
    if os.path.exists(template_file):
        with open(template_file, 'r', encoding='utf-8') as f:
            return json.load(f)
    else:
        # 기본 템플릿
        return {
            "version": "1.0.0",
            "release_date": datetime.now().strftime("%Y-%m-%d"),
            "build_number": 1,
            "hash": "",
            "size": 0,
            "changelog": ["초기 버전"]
        }

def update_version_info(new_version=None, changelog=None):
    """버전 정보 업데이트"""
    
    app_exe = "app.exe"
    version_file = "version.json"
    
    # 기존 버전 정보 로드 또는 템플릿 사용
    if os.path.exists(version_file):
        with open(version_file, 'r', encoding='utf-8') as f:
            version_info = json.load(f)
    else:
        version_info = load_version_template()
    
    # app.exe 파일 정보 업데이트
    if os.path.exists(app_exe):
        version_info["hash"] = calculate_file_hash(app_exe)
        version_info["size"] = get_file_size(app_exe)
        print(f"✅ app.exe 파일 정보 업데이트")
        print(f"   📏 크기: {version_info['size']:,} bytes ({version_info['size']//1024//1024} MB)")
        print(f"   🔐 해시: {version_info['hash'][:16]}...")
    else:
        print("⚠️ app.exe 파일을 찾을 수 없습니다.")
        return False
    
    # 새 버전이 지정되면 업데이트
    if new_version:
        old_version = version_info.get("version", "0.0.0")
        version_info["version"] = new_version
        version_info["build_number"] = version_info.get("build_number", 0) + 1
        print(f"🆙 버전 업데이트: {old_version} → {new_version}")
    
    # 릴리즈 날짜 업데이트
    version_info["release_date"] = datetime.now().strftime("%Y-%m-%d")
    
    # 체인지로그 추가
    if changelog:
        if "changelog" not in version_info:
            version_info["changelog"] = []
        
        if isinstance(changelog, list):
            version_info["changelog"] = changelog
        else:
            version_info["changelog"].insert(0, changelog)
        print(f"📝 체인지로그 업데이트")
    
    # version.json 저장
    with open(version_file, 'w', encoding='utf-8') as f:
        json.dump(version_info, f, indent=2, ensure_ascii=False)
    
    print(f"💾 {version_file} 파일 저장 완료")
    return True

def main():
    """메인 함수"""
    print("=" * 50)
    print("🔄 GeoMedical Helper 버전 업데이트")
    print("=" * 50)
    
    # 명령행 인자 처리
    new_version = None
    changelog = None
    
    if len(sys.argv) > 1:
        new_version = sys.argv[1]
    
    if len(sys.argv) > 2:
        changelog = sys.argv[2]
    
    # 대화형 입력
    if not new_version:
        current_version = "1.0.0"
        if os.path.exists("version.json"):
            with open("version.json", 'r', encoding='utf-8') as f:
                data = json.load(f)
                current_version = data.get("version", "1.0.0")
        
        print(f"현재 버전: {current_version}")
        new_version = input("새 버전을 입력하세요 (Enter = 현재 버전 유지): ").strip()
        if not new_version:
            new_version = None
    
    if not changelog and new_version:
        changelog = input("변경사항을 입력하세요 (선택사항): ").strip()
        if not changelog:
            changelog = None
    
    # 버전 정보 업데이트
    if update_version_info(new_version, changelog):
        print("\n✅ 버전 업데이트 완료!")
        
        # 결과 표시
        with open("version.json", 'r', encoding='utf-8') as f:
            version_info = json.load(f)
        
        print(f"\n📋 업데이트된 정보:")
        print(f"   🏷️ 버전: {version_info['version']}")
        print(f"   📅 릴리즈: {version_info['release_date']}")
        print(f"   🔢 빌드: {version_info['build_number']}")
        print(f"   💾 크기: {version_info['size']:,} bytes")
        
        print(f"\n📂 다음 단계:")
        print(f"   1. version.json 파일 확인")
        print(f"   2. 서버에 app.exe 업로드")
        print(f"   3. 서버에 version.json 업로드")
        print(f"   4. 에이전트 업데이트 실행")
    else:
        print("\n❌ 버전 업데이트 실패")
        return 1
    
    return 0

if __name__ == "__main__":
    try:
        exit_code = main()
        print("\n" + "=" * 50)
        sys.exit(exit_code)
    except KeyboardInterrupt:
        print("\n\n⚠️ 사용자가 중단했습니다.")
        sys.exit(1)
    except Exception as e:
        print(f"\n❌ 오류 발생: {e}")
        sys.exit(1)