import dearpygui.dearpygui as dpg
from src.core.models.models import Session
from src.core.database.managers.scanner_manager import ScannerManager
from src.core.services.reports import generate_json_report, generate_pdf_report
from src.utils.logger import get_logger

logger = get_logger("report_window")

def create_report_window(db, session: Session, parent=None):
    """Окно генерации отчета (с поддержкой родительского контейнера)"""
    if parent:
        with dpg.child_window(
            parent=parent,
            tag="report_window",
            width=-1,
            height=-1
        ):
            build_report_content(db, session)
    else:
        with dpg.child_window(
            tag="report_window",
            width=-1,
            height=-1
        ):
            build_report_content(db, session)

def build_report_content(db, session):
    """Окно генерации отчетов для выбранной сессии"""
    scanner_service = ScannerManager(db)
    
    dpg.add_text(f"Сессия: {session.name}")
    dpg.add_spacer(height=10)
    dpg.add_button(
        label="Генерировать JSON отчет",
        callback=lambda: generate_json_report_callback(scanner_service, session.id),
        width=400,
        height=80
    )
    dpg.add_spacer(height=10)
    dpg.add_button(
        label="Генерировать PDF отчет",
        callback=lambda: generate_pdf_report_callback(scanner_service, session.id),
        width=400,
        height=80
    )
    dpg.add_spacer(height=10)
    dpg.add_text("", tag="report_status")

def generate_json_report_callback(scanner_service, session_id):
    """Обработчик для генерации JSON отчета"""
    # Создаем диалог выбора файла
    dpg.add_file_dialog(
        directory_selector=False,
        default_path="/home/lodqa/",
        width = 800,
        height = 400,
        modal=True,
        callback=lambda s, a: save_json_report(scanner_service, session_id, a['file_path_name']),
        cancel_callback=lambda: dpg.set_value("report_status", "Выбор пути отменен"),
        tag="json_file_dialog",
        show=True
    )

def save_json_report(scanner_service, session_id, file_path):
    """Сохранение JSON отчета"""
    try:
        report = generate_json_report(scanner_service, session_id)
        with open(file_path, 'w', encoding='utf-8') as f:
            f.write(report)
        logger.info(f"JSON отчет сохранен в {file_path}")
        dpg.set_value("report_status", f"JSON отчет сохранен в {file_path}")
        dpg.delete_item("json_file_dialog")  # Удаляем диалог после использования
    except Exception as e:
        logger.error(f"Ошибка при сохранении JSON отчета: {e}")
        dpg.set_value("report_status", f"Ошибка: {str(e)}")
        dpg.delete_item("json_file_dialog")  # Удаляем диалог при ошибке

def generate_pdf_report_callback(scanner_service, session_id):
    """Обработчик для генерации PDF отчета"""
    # Создаем диалог выбора файла
    dpg.add_file_dialog(
        directory_selector=False,
        default_path="/home/lodqa/",
        width = 800,
        height = 400,
        modal=True,
        callback=lambda s, a: save_pdf_report(scanner_service, session_id, a['file_path_name']),
        cancel_callback=lambda: dpg.set_value("report_status", "Выбор пути отменен"),
        tag="pdf_file_dialog",
        show=True
    )

def save_pdf_report(scanner_service, session_id, file_path):
    """Сохранение PDF отчета"""
    try:
        generate_pdf_report(scanner_service, session_id, file_path)
        logger.info(f"PDF отчет сохранен в {file_path}")
        dpg.set_value("report_status", f"PDF отчет сохранен в {file_path}")
        dpg.delete_item("pdf_file_dialog")  # Удаляем диалог после использования
    except Exception as e:
        logger.error(f"Ошибка при сохранении PDF отчета: {e}")
        dpg.set_value("report_status", f"Ошибка: {str(e)}")
        dpg.delete_item("pdf_file_dialog")  # Удаляем диалог при ошибке