import customtkinter as ctk
from view.theme import theme_manager
from view.dialogs.preview_dialog import PreviewDialog

class DetailDialog(ctk.CTkToplevel):
    """VOC 상세 정보를 보여주는 별도의 창"""
    def __init__(self, controller, data):
        super().__init__()
        self.controller = controller
        self.data = data
        self.title(f"VOC 상세 정보 - {data['id']}")
        
        # 윈도우 크기 및 중앙 배치
        self.width = 900
        self.height = 1000
        self._center_window()
        
        # 항상 위 설정 (기본값: False로 변경됨)
        self.topmost_var = ctk.BooleanVar(value=False)
        self.attributes('-topmost', self.topmost_var.get())
        
        # ESC 키 바인딩
        self.bind("<Escape>", lambda e: self.destroy())

        # 포커스 설정
        self.after(100, self.focus_force)

        # 0. 상단 제어 프레임 (항상 위 버튼 등)
        self.control_frame = ctk.CTkFrame(self, fg_color="transparent")
        self.control_frame.pack(fill="x", padx=20, pady=(10, 0))
        
        self.topmost_check = ctk.CTkCheckBox(
            self.control_frame, text="항상 위", variable=self.topmost_var,
            command=self._toggle_topmost, font=theme_manager.get_font(12)
        )
        self.topmost_check.pack(side="right")

        # 전체 컨테이너
        self.main_container = ctk.CTkScrollableFrame(self) # 내용이 길 수 있으므로 스크롤
        self.main_container.pack(fill="both", expand=True, padx=20, pady=(10, 20))

        # 1. 메인 정보 그룹 (상단)
        self._create_info_section(self.main_container, data)
        
        # 구분선
        ctk.CTkFrame(self.main_container, height=2, fg_color="gray50").pack(fill="x", pady=15)

        # 2. 상세 정보 그룹 (중앙)
        self.content_frame = ctk.CTkFrame(self.main_container, fg_color="transparent")
        self.content_frame.pack(fill="both", expand=True)
        
        # 2-1. 제목
        ctk.CTkLabel(
            self.content_frame, 
            text=data['title'], 
            font=theme_manager.get_font(20, "bold"), 
            anchor="w",
            wraplength=800
        ).pack(fill="x", pady=(0, 15))
        
        # 2-2. 처리부서 / 역명
        sub_info_frame = ctk.CTkFrame(self.content_frame, fg_color="transparent")
        sub_info_frame.pack(fill="x", pady=(0, 15))
        
        font_sub = theme_manager.get_font(14)
        ctk.CTkLabel(sub_info_frame, text=f"처리부서: {data.get('department', '-')}", font=font_sub, anchor="w").pack(side="left", padx=(0, 20))
        ctk.CTkLabel(sub_info_frame, text=f"역명: {data.get('station', '-')}", font=font_sub, anchor="w").pack(side="left")

        # 2-3. 질의내용 (가장 큰 영역 차지) area
        ctk.CTkLabel(self.content_frame, text="<질의 내용>", font=theme_manager.get_font(13, "bold"), anchor="w").pack(fill="x")
        
        self.q_text = ctk.CTkTextbox(self.content_frame, font=theme_manager.get_font(14), height=300)
        self.q_text.pack(fill="both", expand=True, pady=(5, 15))
        self.q_text.insert("1.0", str(data.get('content', '')))
        self.q_text.configure(state="disabled")

        # 2-4. 고객 첨부파일
        file_frame = ctk.CTkFrame(self.content_frame)
        file_frame.pack(fill="x", pady=(0, 15))
        ctk.CTkLabel(file_frame, text="첨부파일:", width=80, anchor="w", font=theme_manager.get_font(12)).pack(side="left", padx=10)
        
        att_val = data.get('attachment')
        att_text = str(att_val).strip() if att_val else ""
        if not att_text: att_text = "없음"
        
        text_col = "blue" if att_text != "없음" else ("gray90", "gray10") 
        
        self.lbl_att = ctk.CTkLabel(file_frame, text=att_text, anchor="w", text_color=text_col, font=theme_manager.get_font(12))
        self.lbl_att.pack(side="left", fill="x", expand=True, padx=5)
        
        if att_text != "없음":
             self.lbl_att.bind("<Button-1>", lambda e: self._open_file(att_text))
             self.lbl_att.configure(cursor="hand2")

        # 2-5. 답변내용
        ctk.CTkLabel(self.content_frame, text="<답변 내용>", font=theme_manager.get_font(13, "bold"), anchor="w").pack(fill="x")
        self.a_text = ctk.CTkTextbox(self.content_frame, font=theme_manager.get_font(14), height=150)
        self.a_text.pack(fill="x", pady=(5, 15))
        self.a_text.insert("1.0", str(data.get('answer', '')))
        self.a_text.configure(state="disabled")

        # 3. 하단 버튼 그룹 (스크롤 프레임 밖에 고정)
        # 스크롤 프레임과 별개로 하단에 고정하기 위해 pack을 나중에 하거나 별도 프레임 사용
        # 하지만 CTkToplevel 구조상 pack 순서대로 쌓임.
        # 고정 하단을 원하면 main_container를 pack하기 전에 하단 프레임을 pack(side="bottom") 해야 함.
        pass 
        
        # 버튼을 스크롤 영역 안에 둘지 밖에 둘지 결정 -> 밖에 두는 게 좋음
        # 현재 구조 이미 pack 되었으므로, 재구성이 필요하지만 간단히 스크롤 끝에 둠

        btn_frame = ctk.CTkFrame(self.main_container, fg_color="transparent")
        btn_frame.pack(fill="x", pady=20)
        
        ctk.CTkButton(btn_frame, text="미리보기/인쇄", width=120, 
                      command=self._open_preview).pack(side="left", padx=5)
                      
        ctk.CTkButton(btn_frame, text="보고서생성(Hwp)", width=120, 
                      command=lambda: self.controller.request_create_report(self.data, parent=self)).pack(side="left", padx=5)
                      
        ctk.CTkButton(btn_frame, text="닫기 (ESC)", width=100, command=self.destroy, fg_color="gray").pack(side="right")

    def _open_preview(self):
        PreviewDialog(self, self.controller, self.data)

    def _create_info_section(self, parent, data):
        info_frame = ctk.CTkFrame(parent)
        info_frame.pack(fill="x")
        
        info_frame.columnconfigure((0,1,2,3), weight=1)
        
        row1 = [
            ("접수번호", data['id']),
            ("접수채널", data.get('channel', '-')),
            ("등록일자", data.get('date', '-')),
            ("VOC유형", data.get('voc_type', '-'))
        ]
        
        for idx, (label, val) in enumerate(row1):
            self._add_info_item(info_frame, idx, 0, label, val)

        is_pub = "공개" if data.get('is_public') else "비공개"
        row2 = [
            ("응답구분", data.get('response_type', '-')),
            ("작성자", data.get('writer', '-')),
            ("상태", data['status']),
            ("공개여부", is_pub)
        ]

        for idx, (label, val) in enumerate(row2):
            self._add_info_item(info_frame, idx, 1, label, val)

    def _add_info_item(self, parent, col, row, label, value):
        f = ctk.CTkFrame(parent, fg_color="transparent")
        f.grid(row=row, column=col, padx=10, pady=5, sticky="ew")
        
        ctk.CTkLabel(f, text=label, font=theme_manager.get_font(11), text_color="gray70").pack(anchor="w")
        ctk.CTkLabel(f, text=str(value), font=theme_manager.get_font(12, "bold")).pack(anchor="w")

    def _open_file(self, filename):
        """첨부파일 열기 (컨트롤러 위임)"""
        self.controller.open_attachment(self.data, parent=self)

    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}")

    def _toggle_topmost(self):
        """항상 위 설정을 전환합니다."""
        if self.winfo_exists():
            self.attributes('-topmost', self.topmost_var.get())

    def destroy(self):
        """윈도우 파괴 시 발생할 수 있는 캔버스 관련 TclError 방지"""
        try:
            self.withdraw()
        except: pass
        super().destroy()
