import streamlit as st
import os
import json
from streamlit_quill import st_quill

def run(plugin_info):
    st.markdown("### 🛠 Конструктор инструкций")
    
    # 1. Инициализируем счетчик шагов в памяти, если его еще нет
    if "step_count" not in st.session_state:
        st.session_state.step_count = 1

    with st.container(border=True):
        st.markdown("**Основная информация**")
        col1, col2 = st.columns(2)
        with col1:
            inst_id = st.text_input("Внутреннее имя папки (англ. без пробелов, напр. 'vpn_setup')")
            title = st.text_input("Заголовок карточки")
        with col2:
            desc = st.text_input("Краткое описание")
            order = st.number_input("Приоритет сортировки (1 - на самом верху)", value=999, step=1)
            icon = st.text_input("Эмодзи", value="📖")
            
    st.write("---")
    
    # Здесь мы будем хранить данные из всех шагов перед сохранением
    steps_data = []

    # 2. Динамически генерируем шаги
    for i in range(1, st.session_state.step_count + 1):
        st.markdown(f"#### Шаг {i}")
        with st.container(border=True):
            # Текстовый редактор (обязательно нужен уникальный key для каждого шага!)
            text_content = st_quill(placeholder=f"Текст для шага {i}...", key=f"quill_{i}")
            
            # Переключатель формата картинок
            layout = st.radio(
                "Формат картинок для этого шага:",
                ["Без картинки", "Маленькая сбоку (image)", "Широкая снизу (big_image)", "Галерея в ряд (images)"],
                horizontal=True,
                key=f"layout_{i}"
            )
            
            uploaded_files = []
            if layout != "Без картинки":
                # Если выбрали галерею - разрешаем грузить много файлов
                is_gallery = (layout == "Галерея в ряд (images)")
                files = st.file_uploader(
                    "Загрузите скриншоты", 
                    type=["png", "jpg", "jpeg"], 
                    accept_multiple_files=is_gallery,
                    key=f"file_{i}"
                )
                
                # Приводим к единому формату списка
                if files:
                    uploaded_files = files if is_gallery else [files]
            
            # Запоминаем всё, что ввел пользователь в этом шаге
            steps_data.append({
                "text": text_content,
                "layout": layout,
                "files": uploaded_files
            })

    # Кнопка добавления нового шага
    if st.button("➕ Добавить следующий шаг", use_container_width=True):
        st.session_state.step_count += 1
        st.rerun() # Мгновенно перерисовываем интерфейс с новым шагом

    st.write("---")
    
    # 3. Финальная сборка и сохранение
    if st.button("🚀 Опубликовать инструкцию", type="primary", use_container_width=True):
        if not inst_id or not title:
            st.error("Заполните Внутреннее имя и Заголовок карточки!")
            return
            
        parent_dir = plugin_info["parent_section"]
        new_folder_path = os.path.join("CorpHub", parent_dir, inst_id)
        
        if os.path.exists(new_folder_path):
            st.error(f"Папка '{inst_id}' уже существует! Придумайте другое внутреннее имя.")
            return
            
        os.makedirs(new_folder_path)
        
        # Формируем базу для info.json
        new_info = {
            "title": title,
            "description": desc,
            "icon": icon,
            "category": "instruction",
            "order": order
        }
        
        # Перебираем все заполненные шаги
        for idx, step in enumerate(steps_data):
            step_num = idx + 1
            block_key = f"block_{step_num}"
            
            block_content = {}
            if step["text"]:
                block_content["text"] = step["text"]
                
            # Сохраняем картинки и прописываем правильные ключи
            if step["files"]:
                saved_filenames = []
                for f in step["files"]:
                    # Добавляем номер шага к имени файла, чтобы они не перезаписали друг друга
                    safe_name = f"step{step_num}_{f.name}"
                    with open(os.path.join(new_folder_path, safe_name), "wb") as disk_file:
                        disk_file.write(f.getbuffer())
                    saved_filenames.append(safe_name)
                
                # Подставляем правильный ключ в зависимости от выбора пользователя
                if step["layout"] == "Маленькая сбоку (image)":
                    block_content["image"] = saved_filenames[0]
                elif step["layout"] == "Широкая снизу (big_image)":
                    block_content["big_image"] = saved_filenames[0]
                elif step["layout"] == "Галерея в ряд (images)":
                    block_content["images"] = saved_filenames # Тут отдаем весь список
            
            # Если в шаге только текст - сохраняем как строку, иначе как объект
            if not step["files"] and step["text"]:
                new_info[block_key] = step["text"]
            elif block_content:
                new_info[block_key] = block_content

        # Сохраняем готовый info.json
        with open(os.path.join(new_folder_path, "info.json"), "w", encoding="utf-8") as f:
            json.dump(new_info, f, ensure_ascii=False, indent=2)
            
        # Сбрасываем счетчик шагов для следующей инструкции
        st.session_state.step_count = 1
        st.success("✅ Инструкция успешно опубликована! Вы можете вернуться на главную страницу.")