# -*- coding: utf-8 -*-
"""
Biodiversity Module — Đa dạng sinh học.

Provides tools for biodiversity survey and monitoring:
1. Camera Trap Grid Design (Lưới đặt bẫy ảnh)
2. Photo Viewer (Hiển thị ảnh bẫy / flycam)
3. Forest Inventory Plot Setup (Ô tiêu chuẩn điều tra rừng)
4. Habitat Suitability / Species Release (Kịch bản sinh thái)
5. Animal Sound Localization (Xác định tiếng động vật)
6. Photo Direction Simulation (Mô phỏng hướng chụp ảnh)

Author: Lộc Vũ Trung (LVT) / Slow Forest
License: GPL-3.0
"""

import os

from qgis.PyQt.QtCore import Qt
from ..shared.qt_compat import QtCompat
from qgis.PyQt.QtGui import QIcon, QFont
from qgis.PyQt.QtWidgets import (
    QDialog, QVBoxLayout, QHBoxLayout, QLabel,
    QPushButton, QGroupBox, QGridLayout, QFrame,
    QSizePolicy, QMessageBox
)

from ..shared.i18n import current_language


class BiodiversityDialog(QDialog):
    """Main launcher dialog for the Biodiversity module.

    Displays a grid of sub-module buttons, each launching a specific
    biodiversity tool when implemented.
    """

    # Sub-module definitions: (key, icon, label_vi, label_en, status)
    # status: 'ready' | 'dev' | 'planned'
    MODULES = [
        ('camera_trap', 'bio_camera_trap.svg',
         'Lưới đặt bẫy ảnh',
         'Camera Trap Grid',
         'ready'),
        ('photo_viewer', 'bio_photo_viewer.svg',
         'Hiển thị ảnh bẫy / Flycam',
         'Trap / Flycam Photo Viewer',
         'planned'),
        ('forest_plot', 'bio_forest_plot.svg',
         'Ô tiêu chuẩn điều tra rừng',
         'Forest Inventory Plot',
         'dev'),
        ('habitat', 'bio_habitat.svg',
         'Kịch bản sinh thái ưu thế',
         'Habitat Suitability (AHP)',
         'planned'),
        ('sound_detect', 'bio_sound.svg',
         'Xác định tiếng động vật',
         'Animal Sound Localization',
         'ready'),
        ('photo_sim', 'bio_photo_sim.svg',
         'Mô phỏng hướng chụp ảnh',
         'Photo Direction Simulation',
         'planned'),
    ]

    def __init__(self, iface, parent=None):
        super().__init__(parent)
        self.iface = iface
        self.lang = current_language()
        self.plugin_dir = os.path.dirname(os.path.dirname(__file__))
        self._sub_dialogs = {}
        self._setup_ui()
        self._refresh_ui_text()

    def _icon(self, name):
        """Load icon from the icons/ directory."""
        path = os.path.join(self.plugin_dir, 'icons', name)
        if os.path.isfile(path):
            return QIcon(path)
        # Try without extension
        base, _ = os.path.splitext(name)
        for ext in ('.svg', '.png'):
            p = os.path.join(self.plugin_dir, 'icons', base + ext)
            if os.path.isfile(p):
                return QIcon(p)
        return QIcon()

    def _setup_ui(self):
        """Build the launcher UI with module grid."""
        self.setWindowTitle('Biodiversity')
        self.setMinimumSize(700, 500)
        self.setWindowIcon(self._icon('biodiversity.svg'))

        main_ly = QVBoxLayout(self)

        # --- Header ---
        header = QFrame()
        header.setStyleSheet("""
            QFrame {
                background: qlineargradient(
                    x1:0, y1:0, x2:1, y2:0,
                    stop:0 #1B5E20, stop:1 #388E3C);
                border-radius: 8px;
                padding: 12px;
            }
        """)
        h_ly = QHBoxLayout(header)
        icon_lbl = QLabel()
        icon_lbl.setPixmap(self._icon('biodiversity.svg').pixmap(48, 48))
        h_ly.addWidget(icon_lbl)

        self.lbl_title = QLabel()
        self.lbl_title.setFont(QFont('Segoe UI', 16, QFont.Weight.Bold))
        self.lbl_title.setStyleSheet('color: white;')
        h_ly.addWidget(self.lbl_title, 1)

        self.btn_lang = QPushButton()
        self.btn_lang.setFixedSize(40, 28)
        self.btn_lang.setStyleSheet("""
            QPushButton {
                background: rgba(255,255,255,0.2);
                color: white; border: 1px solid rgba(255,255,255,0.4);
                border-radius: 4px; font-weight: bold;
            }
            QPushButton:hover { background: rgba(255,255,255,0.3)
            }
        """)
        self.btn_lang.clicked.connect(self._toggle_language)
        h_ly.addWidget(self.btn_lang)

        main_ly.addWidget(header)

        # --- Subtitle ---
        self.lbl_subtitle = QLabel()
        self.lbl_subtitle.setStyleSheet(
            'color: #555; font-size: 11px; margin: 4px 0;')
        main_ly.addWidget(self.lbl_subtitle)

        # --- Module Grid ---
        self.gp_modules = QGroupBox()
        grid = QGridLayout()
        grid.setSpacing(12)
        self.module_buttons = {}

        for i, (key, icon_name, label_vi, label_en, status) in enumerate(
                self.MODULES):
            btn = QPushButton()
            btn.setIcon(self._icon(icon_name))
            btn.setIconSize(btn.iconSize() * 2)  # larger icon
            btn.setMinimumSize(200, 70)
            btn.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
            btn.setCursor(QtCompat.PointingHandCursor)

            if status == 'ready':
                style = """
                    QPushButton {
                        background: #E8F5E9; border: 2px solid #4CAF50;
                        border-radius: 8px; font-size: 12px;
                        text-align: left; padding: 10px 16px;
                    }
                    QPushButton:hover {
                        background: #C8E6C9; border-color: #2E7D32;
                    }
                """
            elif status == 'dev':
                style = """
                    QPushButton {
                        background: #FFF3E0; border: 2px solid #FF9800;
                        border-radius: 8px; font-size: 12px;
                        text-align: left; padding: 10px 16px;
                    }
                    QPushButton:hover {
                        background: #FFE0B2; border-color: #F57C00;
                    }
                """
            else:  # planned
                style = """
                    QPushButton {
                        background: #F5F5F5; border: 2px solid #BDBDBD;
                        border-radius: 8px; font-size: 12px;
                        text-align: left; padding: 10px 16px;
                        color: #757575;
                    }
                    QPushButton:hover {
                        background: #EEEEEE; border-color: #9E9E9E;
                    }
                """

            btn.setStyleSheet(style)
            btn.clicked.connect(
                lambda checked, k=key, s=status: self._launch_module(k, s))

            row = i // 2
            col = i % 2
            grid.addWidget(btn, row, col)
            self.module_buttons[key] = btn

        self.gp_modules.setLayout(grid)
        main_ly.addWidget(self.gp_modules, 1)

        # --- Status bar ---
        status_ly = QHBoxLayout()
        self.lbl_status = QLabel()
        self.lbl_status.setStyleSheet('color: #888; font-size: 10px;')
        status_ly.addWidget(self.lbl_status)
        status_ly.addStretch()

        self.btn_help = QPushButton('❓')
        self.btn_help.setFixedSize(28, 28)
        self.btn_help.setToolTip('Help')
        self.btn_help.clicked.connect(self._show_help)
        status_ly.addWidget(self.btn_help)
        main_ly.addLayout(status_ly)

    def _refresh_ui_text(self):
        """Update all UI labels based on current language."""
        is_vi = self.lang == 'vi'
        self.lbl_title.setText(
            '🌿 Đa dạng sinh học' if is_vi else '🌿 Biodiversity')
        self.setWindowTitle(
            'Đa dạng sinh học — LVT4U' if is_vi
            else 'Biodiversity — LVT4U')
        self.btn_lang.setText('EN' if is_vi else 'VI')
        self.lbl_subtitle.setText(
            'Chọn công cụ bên dưới để bắt đầu:'
            if is_vi else 'Select a tool below to begin:')
        self.gp_modules.setTitle(
            'Các module' if is_vi else 'Modules')

        status_map = {
            'ready': ('✅ Sẵn sàng' if is_vi else '✅ Ready'),
            'dev': ('🔧 Đang phát triển' if is_vi else '🔧 In Development'),
            'planned': ('📋 Dự kiến' if is_vi else '📋 Planned'),
        }

        ready_count = sum(
            1 for _, _, _, _, s in self.MODULES if s == 'ready')
        total = len(self.MODULES)
        self.lbl_status.setText(
            f'{ready_count}/{total} module sẵn sàng' if is_vi
            else f'{ready_count}/{total} modules ready')

        for key, icon_name, label_vi, label_en, status in self.MODULES:
            btn = self.module_buttons.get(key)
            if btn:
                label = label_vi if is_vi else label_en
                badge = status_map.get(status, '')
                btn.setText(f'  {label}\n  {badge}')

    def _toggle_language(self):
        """Toggle between Vietnamese and English."""
        self.lang = 'en' if self.lang == 'vi' else 'vi'
        self._refresh_ui_text()

    def _launch_module(self, key, status):
        """Launch a sub-module dialog or show placeholder."""
        if status == 'planned':
            is_vi = self.lang == 'vi'
            QMessageBox.information(
                self,
                '📋 ' + ('Dự kiến' if is_vi else 'Planned'),
                ('Module này đang trong kế hoạch phát triển.\n'
                 'Vui lòng chờ bản cập nhật tiếp theo!'
                 if is_vi else
                 'This module is planned for future development.\n'
                 'Please wait for the next update!'))
            return

        # dev and ready modules — launch dialog
        self._show_sub_dialog(key)

    def _show_sub_dialog(self, key):
        """Lazy-load and show a sub-module dialog.

        Hides the main Biodiversity panel while the sub-dialog is open,
        then re-shows it after the sub-dialog closes.
        """
        self.hide()  # Hide main panel

        try:
            if key == 'forest_plot':
                from .forest_plot.dialog import ForestPlotDialog
                dlg = ForestPlotDialog(self.iface, self.lang)
                dlg.exec()
                return

            if key == 'camera_trap':
                from .camera_trap.dialog import CameraTrapDialog
                dlg = CameraTrapDialog(self.iface, self.lang)
                dlg.exec()
                return

            if key == 'sound_detect':
                from .wildlife_sound.dialog import WildlifeSoundDialog
                dlg = WildlifeSoundDialog(self.iface, self.lang)
                dlg.exec()
                return

            # Placeholder for unimplemented dev modules
            is_vi = self.lang == 'vi'
            QMessageBox.information(
                None, key,
                f'Module {key} — ' + (
                    'đang khởi tạo...' if is_vi else 'initializing...'))
        finally:
            self.show()  # Re-show main panel
            self.raise_()
            self.activateWindow()

    def _show_help(self):
        """Show help for the Biodiversity module."""
        is_vi = self.lang == 'vi'
        QMessageBox.information(
            self,
            '❓ ' + ('Trợ giúp' if is_vi else 'Help'),
            ('Module Đa dạng sinh học cung cấp các công cụ\n'
             'hỗ trợ điều tra và giám sát đa dạng sinh học:\n\n'
             '• Thiết lập lưới đặt bẫy ảnh\n'
             '• Xem ảnh bẫy ảnh / Flycam\n'
             '• Lập ô tiêu chuẩn điều tra rừng\n'
             '• Phân tích kịch bản sinh thái (AHP)\n'
             '• Xác định vị trí tiếng động vật\n'
             '• Mô phỏng hướng chụp ảnh'
             if is_vi else
             'Biodiversity module provides tools for\n'
             'biodiversity survey and monitoring:\n\n'
             '• Camera Trap Grid Design\n'
             '• Trap / Flycam Photo Viewer\n'
             '• Forest Inventory Plot Setup\n'
             '• Habitat Suitability Analysis (AHP)\n'
             '• Animal Sound Localization\n'
             '• Photo Direction Simulation'))
