import customtkinter as ctk

class PreviewDialog(ctk.CTkToplevel):
    """
    보고서 인쇄 미리보기 다이얼로그.
    
    VOC 데이터를 실제 문서 양식과 유사한 형태로 렌더링하여 보여주며,
    인쇄 및 PDF 저장 기능을 제공합니다.
    """
    def __init__(self, parent, controller, data):
        super().__init__(parent)
        self.controller = controller
        self.data = data
        self.title("보고서 미리보기")
        
        # 윈도우 크기 및 중앙 배치
        self.width = 700
        self.height = 900
        self._center_window()
        
        # 항상 위
        self.attributes('-topmost', True)
        if parent:
            self.transient(parent)
        self.lift()
        self.focus_force()
        
        # 1. 상단 툴바
        toolbar = ctk.CTkFrame(self, height=50)
        toolbar.pack(fill="x", padx=10, pady=10)
        
        ctk.CTkButton(toolbar, text="🖨 인쇄하기", command=self._print, width=120).pack(side="left", padx=5)
        ctk.CTkButton(toolbar, text="💾 PDF 저장", command=self._save_pdf, width=120).pack(side="left", padx=5)
        ctk.CTkButton(toolbar, text="닫기", command=self.destroy, fg_color="gray", width=80).pack(side="right", padx=5)
        
        # 2. 문서 영역 (스크롤 가능, 흰색 배경)
        self.scroll_frame = ctk.CTkScrollableFrame(self, fg_color="gray90") # 배경색 약간 어둡게 (문서 강조)
        self.scroll_frame.pack(fill="both", expand=True, padx=10, pady=(0, 10))
        
        # 실제 '종이' 느낌을 주는 프레임
        self.paper = ctk.CTkFrame(self.scroll_frame, fg_color="white", corner_radius=0)
        self.paper.pack(fill="both", expand=True, padx=20, pady=20)
        
        self._render_content()

    def _render_content(self):
        """데이터를 문서 양식으로 렌더링합니다."""
        d = self.data
        
        # 공통 스타일
        font_title = ("Malgun Gothic", 24, "bold")
        font_header = ("Malgun Gothic", 12, "bold")
        font_text = ("Malgun Gothic", 12)
        font_label = ("Malgun Gothic", 12)
        text_color = "black"

        # 1. 문서 제목
        ctk.CTkLabel(self.paper, text="고객의 소리(VOC) 상세 보고서", font=font_title, text_color=text_color).pack(pady=(40, 30))
        
        # 2. 메타 정보 테이블 (Grid)
        info_frame = ctk.CTkFrame(self.paper, fg_color="transparent")
        info_frame.pack(fill="x", padx=40, pady=10)
        
        meta_fields = [
            ("제  목", d.get('title', '')),
            ("작성자", d.get('writer', '')),
            ("부  서", d.get('department', '')),
            ("일  자", d.get('date', '')),
            ("상  태", d.get('status', ''))
        ]
        
        for i, (label, value) in enumerate(meta_fields):
            row = info_frame
            ctk.CTkLabel(row, text=f"■ {label} : ", font=font_header, text_color=text_color, anchor="w", width=80).grid(row=i, column=0, sticky="w", pady=5)
            # 내용은 줄바꿈 가능하도록
            val_lbl = ctk.CTkLabel(row, text=str(value), font=font_label, text_color=text_color, anchor="w", justify="left", wraplength=450)
            val_lbl.grid(row=i, column=1, sticky="w", pady=5)
            
        # 구분선
        ctk.CTkFrame(self.paper, height=2, fg_color="black").pack(fill="x", padx=40, pady=20)
        
        # 3. 질의 내용
        ctk.CTkLabel(self.paper, text="[ 질 의 내 용 ]", font=font_header, text_color=text_color, anchor="w").pack(fill="x", padx=40, pady=(0, 10))
        
        content_box = ctk.CTkFrame(self.paper, fg_color="white", border_width=1, border_color="gray80")
        content_box.pack(fill="x", padx=40, pady=(0, 20))
        
        ctk.CTkLabel(
            content_box, 
            text=d.get('content') or "(내용 없음)", 
            font=font_text, 
            text_color=text_color, 
            anchor="w", 
            justify="left",
            wraplength=520 # A4 폭 고려
        ).pack(fill="both", padx=15, pady=15)
        
        # 4. 답변 내용
        if d.get('answer'):
            ctk.CTkLabel(self.paper, text="[ 답 변 내 용 ]", font=font_header, text_color=text_color, anchor="w").pack(fill="x", padx=40, pady=(10, 10))
            
            answer_box = ctk.CTkFrame(self.paper, fg_color="#F8F9FA", border_width=1, border_color="gray80") # 답변은 약간 회색 배경
            answer_box.pack(fill="x", padx=40, pady=(0, 40))
            
            ctk.CTkLabel(
                answer_box, 
                text=d['answer'], 
                font=font_text, 
                text_color=text_color, 
                anchor="w", 
                justify="left",
                wraplength=520
            ).pack(fill="both", padx=15, pady=15)

    def _print(self):
        """인쇄 요청"""
        self.controller.request_print_voc(self.data)
        
    def _save_pdf(self):
        """PDF 저장 요청"""
        self.controller.request_create_pdf(self.data)

    def _center_window(self):
        """윈도우를 화면 중앙에 배치합니다."""
        self.update_idletasks()
        screen_width = self.winfo_screenwidth()
        screen_height = self.winfo_screenheight()
        x = (screen_width // 2) - (self.width // 2)
        y = (screen_height // 2) - (self.height // 2)
        y = max(0, y - 30)
        self.geometry(f"{self.width}x{self.height}+{x}+{y}")
