/**
 * Создает и управляет визуальными боксами для отображения ссылок в чате.
 * Поддерживает различные стили для файлов/промптов и одинарных/постоянных ссылок.
 */

import { FileReference } from './ReferenceParser';
import { setIcon } from 'obsidian';

// ----------------------------------------------- Reference Box Component ---------------------------------------------------------------

export class ReferenceBox {
    
    /**
     * Создаёт визуальный бокс для отображения ссылки в сообщении
     * @param reference - информация о ссылке
     * @returns HTML элемент бокса
     */
    static createBox(reference: FileReference): HTMLElement {
        const box = document.createElement('span');
        box.className = this.getBoxClasses(reference);
        box.setAttribute('data-reference-type', reference.type);
        box.setAttribute('data-reference-name', reference.name);
        box.setAttribute('data-reference-path', reference.path);
        box.setAttribute('data-reference-permanent', reference.permanent.toString());
        
        // Создаем иконку
        const icon = document.createElement('span');
        icon.className = 'reference-box-icon';
        setIcon(icon, this.getIconName(reference));
        
        // Создаем текст с именем
        const nameSpan = document.createElement('span');
        nameSpan.className = 'reference-box-name';
        nameSpan.textContent = reference.name;
        
        box.appendChild(icon);
        box.appendChild(nameSpan);
        
        // Добавляем обработчик клика для предпросмотра (TODO: будущая функциональность)
        box.addEventListener('click', (e) => {
            e.preventDefault();
            e.stopPropagation();
            // TODO: показать предпросмотр содержимого файла
            console.log('Clicked reference:', reference);
        });
        
        return box;
    }
    
    /**
     * Обновляет существующий бокс
     * @param boxElement - элемент бокса
     * @param reference - новая информация о ссылке
     */
    static updateBox(boxElement: HTMLElement, reference: FileReference): void {
        boxElement.className = this.getBoxClasses(reference);
        boxElement.setAttribute('data-reference-type', reference.type);
        boxElement.setAttribute('data-reference-name', reference.name);
        boxElement.setAttribute('data-reference-path', reference.path);
        boxElement.setAttribute('data-reference-permanent', reference.permanent.toString());
        
        const iconElement = boxElement.querySelector('.reference-box-icon');
        const nameElement = boxElement.querySelector('.reference-box-name');
        
        if (iconElement) {
            iconElement.innerHTML = '';
            setIcon(iconElement as HTMLElement, this.getIconName(reference));
        }
        
        if (nameElement) {
            nameElement.textContent = reference.name;
        }
    }
    
    /**
     * Извлекает информацию о ссылке из элемента бокса
     * @param boxElement - элемент бокса
     * @returns информация о ссылке
     */
    static extractReference(boxElement: HTMLElement): FileReference | null {
        const type = boxElement.getAttribute('data-reference-type') as 'file' | 'prompt';
        const name = boxElement.getAttribute('data-reference-name');
        const path = boxElement.getAttribute('data-reference-path');
        const permanent = boxElement.getAttribute('data-reference-permanent') === 'true';
        
        if (!type || !name || !path) {
            return null;
        }
        
        return {
            type,
            name,
            path,
            permanent
        };
    }
    
    // ----------------------------------------------- Private Methods ---------------------------------------------------------------
    
    /**
     * Возвращает CSS классы для бокса
     */
    private static getBoxClasses(reference: FileReference): string {
        const baseClass = 'reference-box';
        const typeClass = reference.type;
        const permanentClass = reference.permanent ? 'permanent' : 'single';
        
        return `${baseClass} ${typeClass} ${permanentClass}`;
    }
    
    /**
     * Возвращает имя иконки для ссылки
     */
    private static getIconName(reference: FileReference): string {
        if (reference.type === 'prompt') {
            return 'zap';
        }
        
        // Определяем иконку по расширению файла
        const extension = reference.path.split('.').pop()?.toLowerCase();
        switch (extension) {
            case 'md':
                return 'file-text';
            case 'js':
            case 'ts':
                return 'code';
            case 'json':
                return 'brackets';
            case 'css':
                return 'palette';
            case 'png':
            case 'jpg':
            case 'jpeg':
            case 'gif':
                return 'image';
            default:
                return 'file';
        }
    }
}