# ui/panels/data_panel.py
from PyQt6.QtWidgets import (
    QGroupBox, QVBoxLayout, QHBoxLayout, QLabel, QListWidget, 
    QDoubleSpinBox, QPushButton, QComboBox, QCheckBox, QGridLayout
)
from PyQt6.QtCore import Qt, QSize
from PyQt6.QtGui import QIcon, QPixmap, QPainter, QColor
import matplotlib

from ui.common import DragHandle

class DataListPanel(QGroupBox):
    def __init__(self, available_colormaps, parent=None):
        super().__init__("データリストと操作", parent)
        self.init_ui(available_colormaps)

    def init_ui(self, available_colormaps):
        layout = QVBoxLayout()

        # --- リスト ---
        layout.addWidget(QLabel("データリスト(ダブルクリックで表示切替):"))
        self.list_widget_data = QListWidget()
        self.list_widget_data.setFixedHeight(150)
        self.list_widget_data.setSelectionMode(QListWidget.SelectionMode.ExtendedSelection)
        self.list_widget_data.setDragDropMode(QListWidget.DragDropMode.InternalMove)
        layout.addWidget(self.list_widget_data)
        
        self.data_list_handle = DragHandle(self.list_widget_data)
        layout.addWidget(self.data_list_handle)

        # --- オフセットと線幅 ---
        offset_layout = QGridLayout()
        self.manual_offset_label = QLabel("Yオフセット調整:")
        self.spinbox_data_offset = QDoubleSpinBox()
        self.spinbox_data_offset.setRange(-1e7, 1e7)
        self.spinbox_data_offset.setSingleStep(100.0)
        self.spinbox_data_offset.setEnabled(False)
        
        offset_layout.addWidget(self.manual_offset_label, 0, 0)
        offset_layout.addWidget(self.spinbox_data_offset, 0, 1)

        offset_layout.addWidget(QLabel("線の太さ:"), 1, 0)
        self.spinbox_data_linewidth = QDoubleSpinBox()
        self.spinbox_data_linewidth.setRange(0.1, 10.0)
        self.spinbox_data_linewidth.setSingleStep(0.1)
        self.spinbox_data_linewidth.setEnabled(False)
        offset_layout.addWidget(self.spinbox_data_linewidth, 1, 1)
        layout.addLayout(offset_layout)

        # --- 基本操作ボタン ---
        op_layout = QHBoxLayout()
        self.btn_set_color = QPushButton("色変更")
        self.btn_rename_dataset = QPushButton("名前を変更")
        self.btn_rename_dataset.setEnabled(False)
        op_layout.addWidget(self.btn_set_color)
        op_layout.addWidget(self.btn_rename_dataset)
        layout.addLayout(op_layout)
        
        # --- カラースケール ---
        cmap_layout = QHBoxLayout()
        cmap_layout.addWidget(QLabel("カラースケール:"))
        self.combo_colormap = QComboBox()
        self.combo_colormap.setIconSize(QSize(60, 16))
        self._setup_colormap_icons(available_colormaps)
        cmap_layout.addWidget(self.combo_colormap, 1)
        layout.addLayout(cmap_layout)

        range_layout = QHBoxLayout()
        range_layout.addWidget(QLabel("範囲(0-1):"))
        self.spinbox_cmap_min = QDoubleSpinBox()
        self.spinbox_cmap_min.setRange(0, 1); self.spinbox_cmap_min.setSingleStep(0.05)
        self.spinbox_cmap_max = QDoubleSpinBox()
        self.spinbox_cmap_max.setRange(0, 1); self.spinbox_cmap_max.setSingleStep(0.05); self.spinbox_cmap_max.setValue(1.0)
        range_layout.addWidget(self.spinbox_cmap_min)
        range_layout.addWidget(self.spinbox_cmap_max)
        layout.addLayout(range_layout)

        self.btn_apply_colorscale = QPushButton("データにカラースケール適用")
        self.btn_remove_data = QPushButton("選択データを削除")
        layout.addWidget(self.btn_apply_colorscale)
        layout.addWidget(self.btn_remove_data)

        # --- データ処理 (CuKα2 / スムージング) ---
        proc_box = QGroupBox("データ処理 (全体に適用)")
        proc_layout = QVBoxLayout()
        
        ka2_layout = QHBoxLayout()
        self.chk_remove_ka2 = QCheckBox("CuKα2 除去")
        self.spin_ka2_ratio = QDoubleSpinBox()
        self.spin_ka2_ratio.setRange(0.1, 1.0); self.spin_ka2_ratio.setValue(0.5)
        ka2_layout.addWidget(self.chk_remove_ka2)
        ka2_layout.addWidget(QLabel("比:"))
        ka2_layout.addWidget(self.spin_ka2_ratio)
        proc_layout.addLayout(ka2_layout)
        
        smooth_layout = QHBoxLayout()
        self.chk_smooth = QCheckBox("スムージング")
        self.spin_smooth_window = QDoubleSpinBox()
        self.spin_smooth_window.setRange(3, 101); self.spin_smooth_window.setDecimals(0); self.spin_smooth_window.setValue(5)
        smooth_layout.addWidget(self.chk_smooth)
        smooth_layout.addWidget(QLabel("幅:"))
        smooth_layout.addWidget(self.spin_smooth_window)
        proc_layout.addLayout(smooth_layout)
        
        proc_box.setLayout(proc_layout)
        layout.addWidget(proc_box)

        self.setLayout(layout)

    def _setup_colormap_icons(self, colormaps):
        """カラーマップのプレビュー付きコンボボックスを作成"""
        for cmap_name in colormaps:
            try:
                cmap = matplotlib.colormaps.get_cmap(cmap_name)
                pixmap = QPixmap(60, 16)
                painter = QPainter(pixmap)
                for x in range(60):
                    c = cmap(x / 59.0)
                    painter.setPen(QColor.fromRgbF(*c))
                    painter.drawLine(x, 0, x, 16)
                painter.end()
                self.combo_colormap.addItem(QIcon(pixmap), cmap_name)
            except:
                self.combo_colormap.addItem(cmap_name)