"""
Виджет для отображения FITS-метаданных из JP2 файлов
"""

from PySide6.QtWidgets import (
    QWidget, QVBoxLayout, QTreeWidget, QTreeWidgetItem,
    QGroupBox, QLabel, QScrollArea
)
from PySide6.QtCore import Qt


class MetadataViewer(QWidget):
    """Просмотрщик метаданных FITS"""

    def __init__(self):
        super().__init__()
        self.init_ui()

    def init_ui(self):
        layout = QVBoxLayout(self)
        layout.setContentsMargins(0, 0, 0, 0)

        # Используем QScrollArea для метаданных
        scroll_area = QScrollArea()
        scroll_area.setWidgetResizable(True)
        scroll_area.setHorizontalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
        scroll_area.setVerticalScrollBarPolicy(Qt.ScrollBarPolicy.ScrollBarAsNeeded)
        scroll_area.setStyleSheet("""
            QScrollArea {
                border: 1px solid #555;
                border-radius: 5px;
                background-color: #2b2b2b;
            }
        """)

        # Внутренний контейнер
        content_widget = QWidget()
        content_layout = QVBoxLayout(content_widget)
        content_layout.setContentsMargins(5, 5, 5, 5)

        # Дерево для метаданных
        self.tree = QTreeWidget()
        self.tree.setHeaderLabels(["Параметр", "Значение"])
        self.tree.setAlternatingRowColors(True)
        self.tree.setIndentation(10)
        self.tree.setMinimumHeight(150)
        self.tree.setStyleSheet("""
            QTreeWidget {
                background-color: #2b2b2b;
                alternate-background-color: #252525;
                border: none;
            }
            QTreeWidget::item {
                padding: 3px;
            }
        """)
        content_layout.addWidget(self.tree)

        # Информационная метка
        self.info_label = QLabel("Выберите слой для просмотра метаданных")
        self.info_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
        self.info_label.setStyleSheet("color: #888; padding: 20px;")
        self.info_label.setWordWrap(True)
        content_layout.addWidget(self.info_label)

        scroll_area.setWidget(content_widget)
        layout.addWidget(scroll_area)

    def display_metadata(self, metadata: dict):
        """Отображает метаданные в дереве"""
        self.tree.clear()

        if not metadata:
            self.info_label.setVisible(True)
            self.tree.setVisible(False)
            self.info_label.setText("Метаданные не найдены")
            return

        self.info_label.setVisible(False)
        self.tree.setVisible(True)

        # Группировка метаданных
        categories = {
            "📡 Инструмент": ["Телескоп", "Инструмент", "Детектор", "Обсерватория"],
            "🌊 Спектр": ["Длина волны", "Единица длины волны"],
            "📅 Время": ["Дата наблюдения", "Начало экспозиции", "Конец экспозиции", "Время экспозиции (сек)"],
            "📐 Геометрия": ["Центр X (пикс)", "Центр Y (пикс)", "Шаг пикселя X (arcsec)", "Шаг пикселя Y (arcsec)",
                            "Угол поворота (град)"],
            "📊 Изображение": ["Ширина (пикс)", "Высота (пикс)", "Бит на пиксель"],
            "📝 Другое": []
        }

        # Сортируем метаданные
        for category, keys in categories.items():
            category_items = []
            for key in keys:
                if key in metadata and metadata[key]:
                    category_items.append((key, metadata[key]))

            # Для категории "Другое" собираем остальные ключи
            if category == "📝 Другое":
                all_keys = [k for sublist in categories.values() for k in sublist if k != "Другое"]
                for key, value in metadata.items():
                    if key not in all_keys and value:
                        category_items.append((key, value))

            if category_items:
                category_item = QTreeWidgetItem(self.tree)
                category_item.setText(0, category)
                category_item.setExpanded(True)

                for key, value in category_items:
                    param_item = QTreeWidgetItem(category_item)
                    param_item.setText(0, key)
                    param_item.setText(1, str(value))

        self.tree.expandAll()
        self.tree.resizeColumnToContents(0)
        self.tree.resizeColumnToContents(1)

    def clear(self):
        """Очищает отображение метаданных"""
        self.tree.clear()
        self.info_label.setVisible(True)
        self.tree.setVisible(False)
        self.info_label.setText("Выберите слой для просмотра метаданных")