/**
 * Динамическая загрузка страницы (FR-074).
 * Вынесено из dynamic_page.html для соблюдения правил проекта.
 * 
 * Читает данные из элемента <script id="dynamicPageData" type="application/json">.
 */
(function () {
    'use strict';

    var dataEl = document.getElementById('dynamicPageData');
    var parsed = {};
    if (dataEl) {
        try { parsed = JSON.parse(dataEl.textContent); } catch (e) { /* ignore */ }
    }
    var pageInfo = parsed.pageInfo || {};
    var pagePath = parsed.pagePath || '';

    function escapeHtml(text) {
        var div = document.createElement('div');
        div.textContent = text;
        return div.innerHTML;
    }

    function loadScript(src) {
        return new Promise(function (resolve, reject) {
            var script = document.createElement('script');
            script.src = src;
            script.onload = resolve;
            script.onerror = reject;
            document.head.appendChild(script);
        });
    }

    function loadStyle(href) {
        return new Promise(function (resolve, reject) {
            var existingLink = document.querySelector('link[href="' + href + '"]');
            if (existingLink) { resolve(); return; }
            var link = document.createElement('link');
            link.rel = 'stylesheet';
            link.href = href;
            link.onload = resolve;
            link.onerror = reject;
            document.head.appendChild(link);
        });
    }

    function resolveComponentPath(componentPath) {
        if (!componentPath) return componentPath;
        if (componentPath.startsWith('http') || componentPath.startsWith('/')) return componentPath;
        var hasExtension = /\.[a-zA-Z0-9]+$/.test(componentPath);
        var normalizedPath = hasExtension ? componentPath : (componentPath + '.js');
        if (pageInfo.module) {
            return '/static/modules/' + pageInfo.module + '/admin/components/' + normalizedPath;
        } else if (pageInfo.plugin) {
            return '/static/plugins/' + pageInfo.plugin + '/admin/components/' + normalizedPath;
        }
        return '/static/js/' + normalizedPath;
    }

    async function loadComponentInfo(componentId) {
        try {
            var response = await fetch('/api/v1/admin/components/' + componentId);
            var data = await response.json();
            if (data.success && data.data && data.data.component) return data.data.component;
        } catch (e) {
            console.warn('Не удалось получить информацию о компоненте:', e);
        }
        return null;
    }

    async function loadComponentStyles(componentInfo) {
        if (componentInfo && componentInfo.styles) {
            for (var i = 0; i < componentInfo.styles.length; i++) {
                await loadStyle(componentInfo.styles[i]);
            }
        }
    }

    async function loadReactComponent(componentPath, container) {
        try {
            var componentInfo = await loadComponentInfo(componentPath);
            var scriptPath = (componentInfo && componentInfo.path) ? componentInfo.path : resolveComponentPath(componentPath);
            await loadComponentStyles(componentInfo);
            await loadScript(scriptPath);
            if (window.ReactComponent && typeof window.ReactComponent.init === 'function') {
                window.ReactComponent.init(container);
            }
        } catch (error) {
            console.error('Ошибка загрузки React компонента:', error);
            container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки компонента: ' + escapeHtml(error.message) + '</div>';
        }
    }

    async function loadVueComponent(componentPath, container) {
        try {
            var componentInfo = await loadComponentInfo(componentPath);
            var scriptPath = (componentInfo && componentInfo.path) ? componentInfo.path : resolveComponentPath(componentPath);
            await loadComponentStyles(componentInfo);
            await loadScript(scriptPath);
            if (window.VueComponent && typeof window.VueComponent.init === 'function') {
                window.VueComponent.init(container);
            }
        } catch (error) {
            console.error('Ошибка загрузки Vue компонента:', error);
            container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки компонента: ' + escapeHtml(error.message) + '</div>';
        }
    }

    async function loadHTMLTemplate(templatePath, container) {
        try {
            var response = await fetch('/api/v1/admin/pages/template?path=' + encodeURIComponent(templatePath));
            var data = await response.json();
            if (data.success && data.data && typeof data.data.html === 'string') {
                container.innerHTML = data.data.html;
            } else {
                var message = (data.errors && data.errors[0] && data.errors[0].message) ? data.errors[0].message : 'Неизвестная ошибка';
                container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки шаблона: ' + escapeHtml(message) + '</div>';
            }
        } catch (error) {
            container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки шаблона: ' + escapeHtml(error.message) + '</div>';
        }
    }

    async function loadAPIPage(apiEndpoint, container) {
        try {
            var response = await fetch(apiEndpoint);
            var data = await response.json();
            if (data.success) {
                if (data.data && data.data.html) {
                    container.innerHTML = data.data.html;
                } else {
                    container.innerHTML = renderJSONData(data.data || {});
                }
            } else {
                var message = (data.errors && data.errors[0] && data.errors[0].message) ? data.errors[0].message : 'Неизвестная ошибка';
                container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки данных: ' + escapeHtml(message) + '</div>';
            }
        } catch (error) {
            container.innerHTML = '<div class="alert alert-danger">Ошибка загрузки данных: ' + escapeHtml(error.message) + '</div>';
        }
    }

    function renderJSONData(data) {
        if (typeof data === 'object' && data !== null) {
            return '<div class="card"><div class="card-body"><pre class="mb-0">' +
                escapeHtml(JSON.stringify(data, null, 2)) +
                '</pre></div></div>';
        }
        return '<div class="alert alert-info">Нет данных для отображения</div>';
    }

    async function loadDynamicPage() {
        var container = document.getElementById('dynamicPageContainer');
        if (!container) return;

        try {
            if (pageInfo.component_format === 'react') {
                await loadReactComponent(pageInfo.component_path, container);
            } else if (pageInfo.component_format === 'vue') {
                await loadVueComponent(pageInfo.component_path, container);
            } else if (pageInfo.template_path) {
                await loadHTMLTemplate(pageInfo.template_path, container);
            } else if (pageInfo.api_endpoint) {
                await loadAPIPage(pageInfo.api_endpoint, container);
            } else {
                container.innerHTML = '<div class="alert alert-warning">Формат страницы не определен</div>';
            }
        } catch (error) {
            console.error('Ошибка загрузки страницы:', error);
            container.innerHTML = '<div class="alert alert-danger"><h5>Ошибка загрузки страницы</h5><p>' +
                escapeHtml(error.message) + '</p></div>';
        }
    }

    document.addEventListener('DOMContentLoaded', loadDynamicPage);
})();
