"""
파일 처리 관리자 (File Manager)

AppController의 첨부파일 다운로드 및 열기 로직을 전담합니다.
이미지 파일은 뷰어로 표시하고, 일반 파일은 폴더를 엽니다.

주요 기능:
    - 첨부파일 다운로드
    - 이미지 뷰어 열기
    - 일반 파일 폴더 열기

작성자: KH.Choi
최종 수정: 2026-02-17
버전: 1.0 (Controller에서 분리)
"""
import os
from tkinter import messagebox

from utils.path_utils import get_data_dir


class FileManager:
    """
    첨부파일 처리 관리자
    
    VOC 첨부파일을 다운로드하고 적절한 방식으로 표시합니다.
    
    Attributes:
        controller: AppController 인스턴스
        model: VOCScraper 인스턴스
        logger: 로거 인스턴스
        root: Tkinter 루트 윈도우
        test_mode: 테스트 모드 여부
    
    주요 메서드:
        open_attachment: 첨부파일 열기 진입점
    
    사용 예시:
        >>> file_mgr = FileManager(controller)
        >>> file_mgr.open_attachment(voc_data, parent_window)
    """
    
    def __init__(self, controller):
        """
        FileManager 초기화
        
        Args:
            controller (AppController): 메인 컨트롤러 인스턴스
        """
        self.controller = controller
        self.model = controller.model
        self.logger = controller.logger
        self.root = controller.root
        self.test_mode = controller.test_mode
    
    def open_attachment(self, data: dict, parent=None):
        """
        첨부파일을 다운로드하고 이미지면 뷰어로, 아니면 폴더를 엽니다.
        
        처리 흐름:
            1. 첨부파일 존재 여부 확인
            2. 다운로드 (테스트 모드는 로컬 파일만)
            3. 확장자 확인
            4. 이미지 → ImageViewerDialog
            5. 일반 파일 → 폴더 열기
        
        Args:
            data (dict): VOC 데이터
                - id: VOC ID
                - attachment: 첨부파일명
            parent (Widget, optional): 부모 윈도우
        
        Raises:
            Exception: 다운로드 실패 시
        """
        voc_id = data['id']
        att_name = data.get('attachment')
        
        # 첨부파일 존재 여부 확인
        if not att_name or att_name == "없음":
            messagebox.showinfo("알림", "첨부파일이 없는 게시글입니다.")
            return
        
        # 다운로드 경로 설정
        temp_dir = get_data_dir() / "downloads"
        os.makedirs(temp_dir, exist_ok=True)
        
        local_filename = os.path.basename(att_name)
        local_path = temp_dir / local_filename
        
        # 파일 다운로드
        if self.test_mode:
            # 테스트 모드: 로컬 파일만 확인
            if not local_path.exists():
                messagebox.showinfo(
                    "테스트 모드",
                    f"테스트 모드에서는 실제 다운로드를 지원하지 않습니다.\n(파일 없음: {local_filename})"
                )
                return
            final_path = str(local_path)
        else:
            # 실제 다운로드
            try:
                final_path, err = self.model.download_attachment(voc_id, str(temp_dir))
                if err:
                    messagebox.showerror("다운로드 실패", err)
                    return
            except Exception as e:
                self.logger.error(f"첨부파일 다운로드 실패: {e}")
                messagebox.showerror("오류", f"첨부파일 처리 중 오류 발생: {e}")
                return
        
        # 파일 존재 확인
        if not final_path or not os.path.exists(final_path):
            messagebox.showerror("오류", "파일을 찾을 수 없습니다.")
            return
        
        # 확장자에 따라 처리
        self._open_by_extension(final_path, voc_id, parent)
    
    def _open_by_extension(self, file_path: str, voc_id: str, parent):
        """
        파일 확장자에 따라 적절한 방식으로 엽니다 (내부 메서드)
        
        이미지 파일: ImageViewerDialog
        일반 파일: 폴더 열기
        
        Args:
            file_path (str): 파일 경로
            voc_id (str): VOC ID
            parent (Widget): 부모 윈도우
        """
        ext = os.path.splitext(file_path)[1].lower()
        img_exts = ['.jpg', '.jpeg', '.png', '.gif', '.bmp', '.webp']
        
        target_parent = parent if parent else self.root
        
        if ext in img_exts:
            # 이미지 뷰어 열기
            from view.dialogs.image_viewer import ImageViewerDialog
            self.root.after(
                0,
                lambda: ImageViewerDialog(target_parent, file_path, title=f"VOC 첨부이미지 - {voc_id}")
            )
        else:
            # 일반 파일이면 폴더 열기
            os.startfile(os.path.dirname(file_path))
            messagebox.showinfo(
                "알림",
                f"이미지 형식이 아니므로 폴더를 엽니다.\n파일명: {os.path.basename(file_path)}"
            )
