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):
        # 드롭된 URL 중에서 첫 번째 폴더만 사용
        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 폴더의 파일을 하나로 모읍니다.")
        layout.addWidget(info_label)

        # 드롭 영역
        self.drop_area = DropArea(self.set_root_folder)
        layout.addWidget(self.drop_area)

        # BW_Designs 폴더 통합 버튼
        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"루트 폴더: {self.root_folder}")

    def merge_bw_designs(self):
        """루트 폴더 내부의 모든 BW_Designs 폴더를 찾아, 새로 만든 BW_Designs_merged 폴더에 복사"""
        if not self.root_folder or not os.path.isdir(self.root_folder):
            self.drop_area.setText("유효한 루트 폴더가 없습니다. 다시 드래그 앤 드롭 해주세요.")
            return

        # 루트 내부에 BW_Designs_merged 폴더 생성 (이미 있으면 무시)
        merged_folder = os.path.join(self.root_folder, "BW_Designs_merged")
        os.makedirs(merged_folder, exist_ok=True)

        # os.walk로 루트 폴더 전체 탐색
        for current_path, dirs, files in os.walk(self.root_folder):
            # 자신이 방금 만든 BW_Designs_merged 폴더는 재탐색/복사 대상에서 제외
            if current_path == merged_folder:
                continue

            # 폴더 이름이 BW_Designs 인 경우 => 그 내부 파일 전부 복사
            if os.path.basename(current_path) == "BW_Designs":
                # BW_Designs 폴더 안을 재귀적으로 또 탐색 (하위폴더까지 포함)
                for subroot, subdirs, subfiles in os.walk(current_path):
                    for filename in subfiles:
                        src_file = os.path.join(subroot, filename)
                        # (flatten) 모든 파일을 merged_folder 바로 아래로 복사
                        dst_file = os.path.join(merged_folder, filename)

                        # 파일 이름이 중복될 경우 뒤에 숫자 붙이기
                        base, ext = os.path.splitext(filename)
                        count = 1
                        while os.path.exists(dst_file):
                            dst_file = os.path.join(
                                merged_folder, f"{base}_{count}{ext}"
                            )
                            count += 1

                        # 실제 복사
                        shutil.copy2(src_file, dst_file)

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


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