import os
import gzip
import tarfile
import json
from io import BytesIO

def extract_project_json_from_gz(filepath, output_folder):
    # 1. .gz 압축 해제 → tar 형식 데이터 얻기
    with gzip.open(filepath, 'rb') as gz_file:
        tar_data = gz_file.read()

    # 2. tar 데이터를 메모리에서 처리
    tar_bytes = BytesIO(tar_data)

    with tarfile.open(fileobj=tar_bytes, mode='r:') as tar:
        try:
            target = tar.getmember("temp/project.json")
        except KeyError:
            print(f"❌ {os.path.basename(filepath)}: temp/project.json 없음")
            return

        # 압축파일 내부 temp/project.json 파일의 파일 오브젝트 추출
        extracted = tar.extractfile(target)
        if not extracted:
            print(f"❌ {os.path.basename(filepath)}: 파일 추출 실패")
            return

        # 파일 오브젝트를 JSON 객체로 로드 
        project_data = json.load(extracted)

        # 해당 경로에 project.json 파일로 저장
        os.makedirs(output_folder, exist_ok=True)
        output_json_path = os.path.join(output_folder, "project.json")
        with open(output_json_path, "w", encoding="utf-8") as out_file:
            json.dump(project_data, out_file, ensure_ascii=False, indent=2)

        print(f"✅ 처리 완료: {filepath} → {output_json_path}")

def process_ent_files(ent_dir, output_dir):
    for filename in os.listdir(ent_dir):
        if filename.lower().endswith((".ent")):
            filename = filename.replace(" ","")
            filepath = os.path.join(ent_dir, filename)
            output_root = output_dir
            output_folder = os.path.join(output_root, os.path.splitext(filename)[0])
            try:
                extract_project_json_from_gz(filepath, output_folder)
            except Exception as e:
                print(f"❌ 오류 발생 ({filename}): {e}")

# 실행 예
if __name__ == "__main__":
    # test_names = ["2509_CAT_3_A"]
    # test_names = ["2508_CAS_2_A","2508_CAS_2_B"]
    test_names = ["2510_CAS_2_A"]
    for test_name in test_names:
        ent_dir = f".\\ent\\{test_name}"
        output_dir = f".\\output\\{test_name}"
        process_ent_files(ent_dir, output_dir)
