import streamlit as st
import os
import json
from streamlit_quill import st_quill

def run(plugin_info):
    st.markdown("### 🛠 Конструктор инструкций")
    
    # 1. Инициализация переменных состояния (памяти)
    if "editor_mode" not in st.session_state:
        st.session_state.editor_mode = "create"  # "create" или "edit"
        st.session_state.step_count = 1
        st.session_state.loaded_data = None      # Здесь храним загруженную для ред. инструкцию

    # 2. Переключатель режимов
    colA, colB = st.columns(2)
    with colA:
        if st.button("📝 Создать новую", use_container_width=True, type="primary" if st.session_state.editor_mode == "create" else "secondary"):
            st.session_state.editor_mode = "create"
            st.session_state.step_count = 1
            st.session_state.loaded_data = None
            st.rerun()
    with colB:
        if st.button("✏️ Редактировать", use_container_width=True, type="primary" if st.session_state.editor_mode == "edit" else "secondary"):
            st.session_state.editor_mode = "edit"
            st.session_state.loaded_data = None
            st.rerun()

    st.write("---")

    # ==================================================
    # ЛОГИКА РЕЖИМА "РЕДАКТИРОВАНИЕ" (ВЫБОР ИНСТРУКЦИИ)
    # ==================================================
    if st.session_state.editor_mode == "edit" and not st.session_state.loaded_data:
        target_dir = os.path.join("CorpHub", "instructions")
        if not os.path.exists(target_dir):
            st.warning("Папка instructions не найдена.")
            return
            
        # Сканируем все инструкции
        instructions = []
        for d in os.listdir(target_dir):
            p = os.path.join(target_dir, d)
            if os.path.isdir(p) and os.path.exists(os.path.join(p, "info.json")):
                with open(os.path.join(p, "info.json"), "r", encoding="utf-8") as f:
                    data = json.load(f)
                # Берем только статьи (пропуская сам конструктор, если у него category = helper)
                if data.get("category") == "instruction" or "block_1" in data:
                    instructions.append({"id": d, "data": data})
                    
        if not instructions:
            st.info("Нет доступных инструкций для редактирования.")
            return

        # Формируем выпадающий список
        options = {f"{x['data'].get('title', x['id'])} (Папка: {x['id']})": x for x in instructions}
        selected_key = st.selectbox("Выберите инструкцию для редактирования:", list(options.keys()))

        if st.button("⬇️ Загрузить данные", type="primary"):
            sel = options[selected_key]
            
            # Подготавливаем базу данных для интерфейса
            loaded = {
                "inst_id": sel["id"],
                "title": sel["data"].get("title", ""),
                "desc": sel["data"].get("description", ""),
                "icon": sel["data"].get("icon", "📖"),
                "order": sel["data"].get("order", 999),
                "steps": []
            }

            # Парсим блоки block_1, block_2...
            blocks = []
            for k, v in sel["data"].items():
                if k.startswith("block_"):
                    try: blocks.append((int(k.split("_")[1]), v))
                    except: pass
            blocks.sort(key=lambda x: x[0])

            # Расшифровываем старый JSON обратно в данные для интерфейса
            for _, b in blocks:
                step_data = {"text": "", "layout": "Без картинки", "existing_images": []}
                if isinstance(b, str):
                    step_data["text"] = b
                elif isinstance(b, dict):
                    step_data["text"] = b.get("text", "")
                    if "image" in b:
                        step_data["layout"] = "Маленькая сбоку (image)"
                        step_data["existing_images"] = [b["image"]]
                    elif "big_image" in b:
                        step_data["layout"] = "Широкая снизу (big_image)"
                        step_data["existing_images"] = [b["big_image"]]
                    elif "images" in b:
                        step_data["layout"] = "Галерея в ряд (images)"
                        step_data["existing_images"] = b["images"]
                loaded["steps"].append(step_data)

            # Сохраняем в память и обновляем экран
            st.session_state.loaded_data = loaded
            st.session_state.step_count = max(1, len(loaded["steps"]))
            st.rerun()
            
        # Останавливаем отрисовку, пока не нажата кнопка "Загрузить"
        return

    # ==================================================
    # ОБЩИЙ ИНТЕРФЕЙС (СОЗДАНИЕ ИЛИ РЕДАКТИРОВАНИЕ)
    # ==================================================
    ld = st.session_state.loaded_data or {}
    is_edit = (st.session_state.editor_mode == "edit")

    with st.container(border=True):
        st.markdown(f"**{'Редактирование карточки' if is_edit else 'Основная информация'}**")
        col1, col2 = st.columns(2)
        with col1:
            # Запрещаем менять имя папки при редактировании, чтобы не сломать ссылки
            inst_id = st.text_input("Внутреннее имя папки (англ. без пробелов)", value=ld.get("inst_id", ""), disabled=is_edit)
            title = st.text_input("Заголовок карточки", value=ld.get("title", ""))
        with col2:
            desc = st.text_input("Краткое описание", value=ld.get("desc", ""))
            order = st.number_input("Приоритет сортировки", value=ld.get("order", 999), step=1)
            icon = st.text_input("Эмодзи", value=ld.get("icon", "📖"))
            
    st.write("---")
    
    steps_data = []

    # Отрисовываем шаги
    for i in range(1, st.session_state.step_count + 1):
        st.markdown(f"#### Шаг {i}")
        
        # Подхватываем данные для конкретного шага, если мы в режиме редактирования
        def_text = ""
        def_layout = "Без картинки"
        def_imgs = []
        if is_edit and i <= len(ld.get("steps", [])):
            step_ld = ld["steps"][i-1]
            def_text = step_ld["text"]
            def_layout = step_ld["layout"]
            def_imgs = step_ld["existing_images"]

        with st.container(border=True):
            # Вставляем готовый HTML-код в редактор
            text_content = st_quill(html=def_text, placeholder=f"Текст для шага {i}...", key=f"quill_{i}")
            
            layout_opts = ["Без картинки", "Маленькая сбоку (image)", "Широкая снизу (big_image)", "Галерея в ряд (images)"]
            try: layout_idx = layout_opts.index(def_layout)
            except: layout_idx = 0
            
            layout = st.radio("Формат картинок:", layout_opts, horizontal=True, index=layout_idx, key=f"layout_{i}")
            
            uploaded_files = []
            if layout != "Без картинки":
                is_gallery = (layout == "Галерея в ряд (images)")
                
                # Показываем, что в этом шаге уже есть картинка на сервере
                if is_edit and def_imgs:
                    st.info(f"💾 Текущие файлы на сервере: **{', '.join(def_imgs)}**. Загрузите новые, если хотите их заменить.")
                    
                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,
                "existing_imgs": def_imgs if is_edit and not uploaded_files else [] # Запоминаем старые картинки, если не загрузили новые
            })

    if st.button("➕ Добавить следующий шаг", use_container_width=True):
        st.session_state.step_count += 1
        st.rerun()

    st.write("---")
    
    # ==================================================
    # ФИНАЛЬНОЕ СОХРАНЕНИЕ 
    # ==================================================
    btn_text = "💾 Сохранить изменения" if is_edit else "🚀 Опубликовать новую инструкцию"
    if st.button(btn_text, type="primary", use_container_width=True):
        if not inst_id or not title:
            st.error("Заполните Внутреннее имя и Заголовок карточки!")
            return
            
        new_folder_path = os.path.join("CorpHub", "instructions", inst_id)
        
        # Защита от перезаписи при создании новой
        if not is_edit and os.path.exists(new_folder_path):
            st.error(f"Папка '{inst_id}' уже существует! Придумайте другое имя.")
            return
            
        if not os.path.exists(new_folder_path):
            os.makedirs(new_folder_path)
            
        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"]
                
            saved_filenames = []
            
            # Сценарий 1: Пользователь загрузил новые файлы
            if step["files"]:
                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)
                    
            # Сценарий 2: Файлы не грузили, но были старые (сохраняем ссылки на них)
            elif step["existing_imgs"] and step["layout"] != "Без картинки":
                saved_filenames = step["existing_imgs"]
                
            # Формируем JSON ключи
            if saved_filenames:
                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 saved_filenames and step["text"]:
                new_info[block_key] = step["text"]
            elif block_content:
                new_info[block_key] = block_content

        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.success("✅ Инструкция успешно сохранена! Можете вернуться на главную страницу.")
        
        # Сброс после успешного создания
        if not is_edit:
            st.session_state.step_count = 1