/**
 * NFO Manager Module
 * 
 * Handles NFO metadata operations including creating, viewing, and refreshing
 * NFO files for anime series.
 */

window.AniWorld = window.AniWorld || {};

AniWorld.NFOManager = (function() {
    'use strict';

    /**
     * Create NFO metadata for a series
     * @param {string} seriesKey - The unique identifier for the series
     * @returns {Promise<object>} API response
     */
    async function createNFO(seriesKey) {
        try {
            AniWorld.UI.showLoading('Creating NFO metadata...');
            
            const response = await AniWorld.ApiClient.request(
                `/api/nfo/${encodeURIComponent(seriesKey)}/create`,
                {
                    method: 'POST',
                    body: JSON.stringify({
                        overwrite_existing: false,
                        download_poster: true,
                        download_logo: true,
                        download_fanart: true
                    })
                }
            );
            
            if (!response) {
                throw new Error('Failed to create NFO');
            }
            
            const data = await response.json();
            
            if (data && data.message) {
                AniWorld.UI.showToast(data.message || 'NFO created successfully', 'success');
                return data;
            } else {
                throw new Error('Failed to create NFO');
            }
        } catch (error) {
            console.error('Error creating NFO:', error);
            AniWorld.UI.showToast(
                'Failed to create NFO: ' + error.message,
                'error'
            );
            throw error;
        } finally {
            AniWorld.UI.hideLoading();
        }
    }

    /**
     * Refresh NFO metadata for a series (update existing NFO)
     * @param {string} seriesKey - The unique identifier for the series
     * @returns {Promise<object>} API response
     */
    async function refreshNFO(seriesKey) {
        try {
            AniWorld.UI.showLoading('Refreshing NFO metadata...');
            
            const response = await AniWorld.ApiClient.request(
                `/api/nfo/${encodeURIComponent(seriesKey)}/update`,
                {
                    method: 'PUT'
                }
            );
            
            if (!response) {
                throw new Error('Failed to refresh NFO');
            }
            
            const data = await response.json();
            
            if (data && data.message) {
                AniWorld.UI.showToast(data.message || 'NFO updated successfully', 'success');
                return data;
            } else {
                throw new Error('Failed to refresh NFO');
            }
        } catch (error) {
            console.error('Error refreshing NFO:', error);
            AniWorld.UI.showToast(
                'Failed to refresh NFO: ' + error.message,
                'error'
            );
            throw error;
        } finally {
            AniWorld.UI.hideLoading();
        }
    }

    /**
     * View NFO metadata for a series
     * @param {string} seriesKey - The unique identifier for the series
     * @returns {Promise<object>} NFO data
     */
    async function viewNFO(seriesKey) {
        try {
            AniWorld.UI.showLoading('Loading NFO data...');
            
            const response = await AniWorld.ApiClient.request(
                `/api/nfo/${encodeURIComponent(seriesKey)}/content`
            );
            
            if (!response) {
                throw new Error('No NFO data available');
            }
            
            const data = await response.json();
            
            if (data && data.content) {
                return data;
            } else {
                throw new Error('No NFO data available');
            }
        } catch (error) {
            console.error('Error viewing NFO:', error);
            AniWorld.UI.showToast(
                'Failed to load NFO: ' + error.message,
                'error'
            );
            throw error;
        } finally {
            AniWorld.UI.hideLoading();
        }
    }

    /**
     * Show NFO data in a modal
     * @param {string} seriesKey - The unique identifier for the series
     */
    async function showNFOModal(seriesKey) {
        try {
            const nfoData = await viewNFO(seriesKey);
            
            // Format NFO data for display
            const nfoHtml = formatNFOData(nfoData);
            
            // Show modal (assuming a modal utility exists)
            if (AniWorld.UI.showModal) {
                AniWorld.UI.showModal({
                    title: 'NFO Metadata',
                    content: nfoHtml,
                    size: 'large'
                });
            } else {
                // Fallback: log to console
                console.log('NFO Data:', nfoData);
                alert('NFO Data:\n' + JSON.stringify(nfoData, null, 2));
            }
        } catch (error) {
            console.error('Error showing NFO modal:', error);
        }
    }

    /**
     * Format NFO data for display in HTML
     * @param {object} nfoData - NFO metadata object
     * @returns {string} HTML string
     */
    function formatNFOData(nfoData) {
        let html = '<div class="nfo-data">';
        
        if (nfoData.title) {
            html += '<div class="nfo-field"><strong>Title:</strong> ' + 
                AniWorld.UI.escapeHtml(nfoData.title) + '</div>';
        }
        
        if (nfoData.plot) {
            html += '<div class="nfo-field"><strong>Plot:</strong> ' + 
                AniWorld.UI.escapeHtml(nfoData.plot) + '</div>';
        }
        
        if (nfoData.year) {
            html += '<div class="nfo-field"><strong>Year:</strong> ' + 
                nfoData.year + '</div>';
        }
        
        if (nfoData.genre) {
            const genres = Array.isArray(nfoData.genre) 
                ? nfoData.genre.join(', ') 
                : nfoData.genre;
            html += '<div class="nfo-field"><strong>Genre:</strong> ' + 
                AniWorld.UI.escapeHtml(genres) + '</div>';
        }
        
        if (nfoData.rating) {
            html += '<div class="nfo-field"><strong>Rating:</strong> ' + 
                nfoData.rating + '</div>';
        }
        
        if (nfoData.tmdb_id) {
            html += '<div class="nfo-field"><strong>TMDB ID:</strong> ' + 
                nfoData.tmdb_id + '</div>';
        }
        
        if (nfoData.tvdb_id) {
            html += '<div class="nfo-field"><strong>TVDB ID:</strong> ' + 
                nfoData.tvdb_id + '</div>';
        }
        
        html += '</div>';
        return html;
    }

    /**
     * Get series without NFO
     * @returns {Promise<object>} Response with series list and statistics
     */
    async function getSeriesWithoutNFO() {
        try {
            const response = await AniWorld.ApiClient.request('/api/nfo/missing');
            
            if (!response) {
                throw new Error('Failed to get series without NFO');
            }
            
            const data = await response.json();
            
            if (data && data.series) {
                return data;
            } else {
                throw new Error('Failed to get series without NFO');
            }
        } catch (error) {
            console.error('Error getting series without NFO:', error);
            throw error;
        }
    }

    // Public API
    return {
        createNFO: createNFO,
        refreshNFO: refreshNFO,
        viewNFO: viewNFO,
        showNFOModal: showNFOModal,
        getSeriesWithoutNFO: getSeriesWithoutNFO
    };
})();
