import gradio as gr
import pandas as pd
import os
from work import LDAAnalyzer
from datetime import datetime
import shutil

BASE_OUTPUT_DIR = "output"
os.makedirs(BASE_OUTPUT_DIR, exist_ok=True)

def create_output_dir():
    """Создание директории для текущего анализа"""
    timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
    output_dir = os.path.join(BASE_OUTPUT_DIR, timestamp)
    os.makedirs(output_dir, exist_ok=True)
    return output_dir

def show_columns(file):
    """Получение списка колонок из загруженного файла"""
    if file is None:
        return gr.Dropdown(
            choices=[],
            value=None,
            interactive=False,
            label="Сначала загрузите файл"
        )
    
    try:
        df = pd.read_excel(file.name)
        columns = [f"{i}: {col}" for i, col in enumerate(df.columns)]
        return gr.Dropdown(
            choices=columns,
            value=None,
            interactive=True,
            label="Выберите колонку для анализа"
        )
    except Exception as e:
        return gr.Dropdown(
            choices=[],
            value=None,
            interactive=False,
            label=f"Ошибка чтения файла: {str(e)}"
        )

def perform_analysis(file, selected_column, progress=gr.Progress()):
    """Выполнение LDA анализа"""
    if file is None or selected_column is None:
        return ["⚠️ Ошибка: Загрузите файл и выберите колонку", 
                None, None, None, None, None]
    
    try:
        output_dir = create_output_dir()
        input_file_path = os.path.join(output_dir, "data.xlsx")
        shutil.copy2(file.name, input_file_path)
        
        column_idx = int(selected_column.split(":")[0])
        
        progress(0, desc="Инициализация...")
        analyzer = LDAAnalyzer(input_file_path, column_idx)
        
        # Загрузка данных
        progress(0.2, desc="📂 Загрузка данных...")
        analyzer.load_data()
        
        # Подготовка данных
        progress(0.4, desc="🔄 Подготовка данных...")
        analyzer.prepare_data()
        
        # Выполнение анализа
        progress(0.6, desc="📊 Выполнение LDA анализа...")
        analyzer.perform_lda()
        
        # Получение и подготовка результатов перед сохранением
        progress(0.8, desc="📊 Формирование результатов...")
        
        # Получаем матрицы напрямую из анализатора
        confusion_matrix, percentages, accuracy = analyzer.create_confusion_matrix()
        coefficients = analyzer.get_coefficients()
        
        # Подготовка данных для отображения
        
        # 1. Матрица классификации
        df1 = confusion_matrix.copy()
        df1.index = [f"{i+1}.00" for i in range(len(df1))]
        df1.insert(0, "Исходный", df1.index)
        df1.insert(1, "Количество", df1["Всего"])
        
        # 2. Проценты классификации
        df2 = pd.DataFrame(percentages)
        df2.index = [f"{i+1}.00" for i in range(len(df2))]
        df2.columns = df1.columns[2:]  # Используем те же заголовки
        df2.insert(0, "Исходный", df2.index)
        df2.insert(1, "Количество", confusion_matrix["Всего"])
        
        # Добавляем строку с примечанием
        note_row = pd.DataFrame({
            "Исходный": f"* Примечание: {accuracy:.1f}% наблюдений классифицированы правильно.",
            "Количество": "",
        }, index=[""])
        df2 = pd.concat([df2, note_row])
        
        # 3. Коэффициенты
        df3 = coefficients.copy()
        df3.index.name = "Переменная"
        df3 = df3.reset_index()
        
        # Сохранение результатов
        progress(0.9, desc="💾 Сохранение результатов...")
        analyzer.save_results(output_dir)
        
        # Пути к файлам
        results_file = os.path.join(output_dir, 'lda_results.xlsx')
        plot_file = os.path.join(output_dir, 'lda_visualization.png')
        
        progress(1.0, desc="✅ Готово!")
        return [
            f"✅ Анализ успешно завершен!\nРезультаты сохранены в: {output_dir}",
            df1,
            df2,
            df3,
            plot_file,
            results_file
        ]
            
    except Exception as e:
        error_msg = f"❌ Ошибка при выполнении анализа: {str(e)}"
        print(error_msg)  # для отладки
        return [error_msg, None, None, None, None, None]

with gr.Blocks(title="LDA Анализ", theme=gr.themes.Soft()) as demo:
    gr.Markdown("""
    # 📊 LDA Анализ
    ### Загрузите Excel файл и выберите колонку для анализа
    """)
    
    with gr.Row():
        with gr.Column(scale=1):
            file_input = gr.File(
                label="📑 Excel файл",
                file_types=[".xlsx", ".xls"],
                type="filepath"
            )
            
        with gr.Column(scale=1):
            column_select = gr.Dropdown(
                label="🎯 Выберите колонку",
                choices=[],
                interactive=False
            )
            
        with gr.Column(scale=1):
            start_btn = gr.Button(
                "▶️ Начать анализ",
                variant="primary"
            )
    
    status = gr.Markdown("💡 Ожидание начала анализа...")
    
    with gr.Tabs() as tabs:
        with gr.Tab("📋 Матрица классификации"):
            df1 = gr.Dataframe(
                label="Матрица классификации",
                headers=None,
                datatype="number",
                wrap=True,
            )
            
        with gr.Tab("📊 Проценты"):
            df2 = gr.Dataframe(
                label="Проценты классификации",
                headers=None,
                datatype="number",
                wrap=True
            )
            
        with gr.Tab("📈 Коэффициенты"):
            df3 = gr.Dataframe(
                label="Коэффициенты функций",
                headers=None,
                datatype="number",
                wrap=True
            )
            
        with gr.Tab("📉 Визуализация"):
            with gr.Column():
                results_plot = gr.Image(
                    label="График результатов",
                    show_label=True
                )
                
        with gr.Tab("📁 Файлы"):
            with gr.Column():
                results_file = gr.File(
                    label="📊 Скачать полный отчет",
                    show_label=True
                )
    
    # Обработчики событий
    file_input.change(
        fn=show_columns,
        inputs=[file_input],
        outputs=[column_select]
    )
    
    start_btn.click(
        fn=perform_analysis,
        inputs=[file_input, column_select],
        outputs=[
            status,
            df1, df2, df3,
            results_plot, results_file
        ],
        show_progress=True
    )

if __name__ == "__main__":
    demo.launch()