/**
 * MCP Client Library - JavaScript API dla komunikacji z serwerem MCP
 */

class MCPClient {
    constructor(apiUrl = 'https://mcpforum.pl') {
        this.apiUrl = apiUrl;
        this.resultTimeout = null;
        this.domReady = false;
        this.isRequestInProgress = false;
        
        // Sprawdź czy DOM jest już gotowy
        if (typeof document !== 'undefined') {
            if (document.readyState === 'loading') {
                document.addEventListener('DOMContentLoaded', () => {
                    this.domReady = true;
                    this.ensureUIElements();
                });
            } else {
                this.domReady = true;
                this.ensureUIElements();
            }
        }
    }

    /**
     * Zapewnia istnienie elementów UI, tworzy je jeśli nie istnieją
     */
    ensureUIElements() {
        if (typeof document === 'undefined') return; // nie w przeglądarce
        
        // Sprawdź czy elementy istnieją
        if (!document.getElementById('loading')) {
            const loading = document.createElement('div');
            loading.id = 'loading';
            loading.className = 'loading';
            loading.style.display = 'none';
            loading.style.textAlign = 'center';
            loading.style.color = '#666';
            loading.style.fontStyle = 'italic';
            loading.textContent = '⏳ Wykonywanie polecenia...';
            document.body.appendChild(loading);
        }

        if (!document.getElementById('result')) {
            const result = document.createElement('div');
            result.id = 'result';
            result.className = 'result';
            result.style.display = 'none';
            result.style.marginTop = '20px';
            result.style.padding = '15px';
            result.style.borderRadius = '8px';
            result.style.fontWeight = 'bold';
            document.body.appendChild(result);
        }
    }

    /**
     * Wywołuje narzędzie MCP na serwerze z automatyczną obsługą błędów
     * @param {string} toolName - nazwa narzędzia
     * @param {Object} params - parametry narzędzia
     */
    async callToolSafe(toolName, params = {}) {
        try {
            return await this.callToolAsync(toolName, params);
        } catch (error) {
            this.showResult(`Błąd: ${error.message}`, 'error');
            return { success: false, error: error.message };
        }
    }
	
	/**
	 * Wywołuje narzędzie MCP na serwerze z automatyczną obsługą błędów
	 * @param {string} toolName - nazwa narzędzia
	 * @param {Object} params - parametry narzędzia
	 */
	async callTool(toolName, params = {}) {
        return await this.callToolSafe(toolName, params);
	}

    /**
     * Wywołuje narzędzie MCP na serwerze
     * @param {string} toolName - nazwa narzędzia
     * @param {Object} params - parametry narzędzia
     * @returns {Promise<Object>} wynik wywołania
     */
    async callToolAsync(toolName, params = {}) {
        // Zapobiegaj wielokrotnym równoczesnym requestom
        if (this.isRequestInProgress) {
            this.showResult('Proszę poczekać na zakończenie poprzedniej operacji', 'error');
            return { success: false, error: 'Request in progress' };
        }

        this.isRequestInProgress = true;
        this.showLoading(true);
        this.hideResult();

        try {
            const response = await fetch(`${this.apiUrl}/execTool`, {
                method: 'POST',
                headers: {
                    'Content-Type': 'application/json',
                },
                body: JSON.stringify({
                    tool: toolName,
                    params: params
                })
            });

            if (!response.ok) {
                throw new Error(`HTTP ${response.status}: ${response.statusText}`);
            }

            let data;
            try {
                data = await response.json();
            } catch (jsonError) {
                throw new Error(`Nieprawidłowa odpowiedź JSON: ${jsonError.message}`);
            }
            
            if (data.success) {
                this.showResult(data.result, 'success');
                return { success: true, result: data.result };
            } else {
                this.showResult(`Błąd: ${data.result}`, 'error');
                return { success: false, error: data.result };
            }
        } catch (error) {
            const errorMsg = `Błąd połączenia: ${error.message}`;
            this.showResult(errorMsg, 'error');
            return { success: false, error: errorMsg };
        } finally {
            this.showLoading(false);
            this.isRequestInProgress = false;
        }
    }

    /**
     * Pobiera listę dostępnych narzędzi
     * @returns {Promise<Array>} lista narzędzi
     */
    async getTools() {
        try {
            const response = await fetch(`${this.apiUrl}/tools`);
            
            if (!response.ok) {
                throw new Error(`HTTP ${response.status}: ${response.statusText}`);
            }
            
            let data;
            try {
                data = await response.json();
            } catch (jsonError) {
                throw new Error(`Nieprawidłowa odpowiedź JSON: ${jsonError.message}`);
            }
            return data.tools || [];
        } catch (error) {
            console.error('Błąd pobierania narzędzi:', error);
            return [];
        }
    }

    // UI Helper Methods
    showLoading(show) {
        const loadingEl = document.getElementById('loading');
        if (loadingEl) {
            loadingEl.style.display = show ? 'block' : 'none';
        }
    }

    showResult(message, type) {
        const resultDiv = document.getElementById('result');
        if (resultDiv) {
            // Wyczyść poprzedni timeout jeśli istnieje
            if (this.resultTimeout) {
                clearTimeout(this.resultTimeout);
                this.resultTimeout = null;
            }
            
            resultDiv.textContent = message;
            resultDiv.className = `result ${type}`;
            resultDiv.style.display = 'block';
            
            // Dodatkowe style dla typu
            if (type === 'success') {
                resultDiv.style.background = '#d4edda';
                resultDiv.style.color = '#155724';
                resultDiv.style.border = '1px solid #c3e6cb';
            } else if (type === 'error') {
                resultDiv.style.background = '#f8d7da';
                resultDiv.style.color = '#721c24';
                resultDiv.style.border = '1px solid #f5c6cb';
            }
            
            // Ukryj po 5 sekundach
            this.resultTimeout = setTimeout(() => {
                this.hideResult();
                this.resultTimeout = null;
            }, 5000);
        }
    }

    hideResult() {
        // Wyczyść timeout jeśli istnieje
        if (this.resultTimeout) {
            clearTimeout(this.resultTimeout);
            this.resultTimeout = null;
        }
        
        const resultDiv = document.getElementById('result');
        if (resultDiv) {
            resultDiv.style.display = 'none';
        }
    }

}

// Globalna instancja klienta MCP
const mcpClient = new MCPClient();

// Eksport dla użycia w innych plikach
if (typeof module !== 'undefined' && module.exports) {
    module.exports = MCPClient;
}