import sys
import os
import shutil
from PyQt5.QtWidgets import (
    QApplication, QWidget, QLabel, QVBoxLayout,
    QPushButton
)
from PyQt5.QtCore import Qt

class DropArea(QLabel):
    def __init__(self, drop_callback, parent=None):
        super().__init__(parent)
        self.drop_callback = drop_callback
        self.setAcceptDrops(True)
        self.setAlignment(Qt.AlignCenter)
        self.setText("여기에 루트 폴더를 드래그 앤 드롭하세요.")

    def dragEnterEvent(self, event):
        if event.mimeData().hasUrls():
            event.acceptProposedAction()

    def dropEvent(self, event):
        for url in event.mimeData().urls():
            path = url.toLocalFile()
            if os.path.isdir(path):
                self.drop_callback(path)
                break

class MainWindow(QWidget):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("BW_Designs 폴더 구조 유지 통합")
        self.root_folder = None

        layout = QVBoxLayout()
        info_label = QLabel(
            "1) 최상위(루트) 폴더를 드래그 앤 드롭하세요.\n"
            "2) 'BW_Designs 폴더 통합 실행' 버튼을 클릭하면,\n"
            "   루트 폴더 내부의 모든 BW_Designs 폴더의 내부 폴더 구조를\n"
            "   그대로 유지하며 BW_Designs_merged 폴더로 복사합니다."
        )
        layout.addWidget(info_label)

        self.drop_area = DropArea(self.set_root_folder)
        layout.addWidget(self.drop_area)

        self.btn_merge = QPushButton("BW_Designs 폴더 통합 실행")
        self.btn_merge.clicked.connect(self.merge_bw_designs)
        layout.addWidget(self.btn_merge)

        self.setLayout(layout)

    def set_root_folder(self, folder_path):
        self.root_folder = folder_path
        self.drop_area.setText(f"루트 폴더:\n{self.root_folder}")

    def merge_bw_designs(self):
        if not self.root_folder or not os.path.isdir(self.root_folder):
            self.drop_area.setText("유효한 루트 폴더가 아닙니다.\n다시 드래그 앤 드롭 해주세요.")
            return

        # 루트 폴더 내에 BW_Designs_merged 폴더 생성
        merged_folder = os.path.join(self.root_folder, "BW_Designs_merged")
        os.makedirs(merged_folder, exist_ok=True)

        # 루트 폴더 내에서 모든 BW_Designs 폴더를 찾기 (재귀적으로 검색)
        for current_path, dirs, _ in os.walk(self.root_folder):
            # BW_Designs_merged 폴더 자체는 건너뜁니다.
            if os.path.abspath(current_path) == os.path.abspath(merged_folder):
                continue

            # 현재 폴더가 "BW_Designs" 폴더라면 복사 진행
            if os.path.basename(current_path) == "BW_Designs":
                self.copy_preserving_structure(current_path, merged_folder)

        self.drop_area.setText("BW_Designs 폴더 통합이 완료되었습니다!")

    def copy_preserving_structure(self, src_bw_dir, merged_folder):
        """
        src_bw_dir 내부의 폴더 구조를 그대로 유지하면서,
        파일들을 merged_folder 내에 복사합니다.
        """
        for src_root, subdirs, files in os.walk(src_bw_dir):
            # src_bw_dir 내부의 상대 경로 계산 (현재 폴더의 구조를 유지)
            rel_path = os.path.relpath(src_root, src_bw_dir)
            # 만약 rel_path가 '.'이면 BW_Designs 폴더 바로 내부임
            dest_dir = os.path.join(merged_folder, rel_path) if rel_path != '.' else merged_folder

            os.makedirs(dest_dir, exist_ok=True)

            for filename in files:
                src_file = os.path.join(src_root, filename)
                dest_file = os.path.join(dest_dir, filename)

                # 중복 파일명이 있을 경우 숫자 추가
                if os.path.exists(dest_file):
                    base, ext = os.path.splitext(filename)
                    count = 1
                    new_filename = f"{base}_{count}{ext}"
                    dest_file = os.path.join(dest_dir, new_filename)
                    while os.path.exists(dest_file):
                        count += 1
                        new_filename = f"{base}_{count}{ext}"
                        dest_file = os.path.join(dest_dir, new_filename)

                shutil.copy2(src_file, dest_file)

if __name__ == "__main__":
    app = QApplication(sys.argv)
    window = MainWindow()
    window.resize(500, 350)
    window.show()
    sys.exit(app.exec_())
