/**
 * SINAGEM DataTables Config v1.0
 * Configuração global para DataTables com padrão SINAGEM
 * Compatível com Bootstrap 5 e Font Awesome
 */

const SinagemDataTablesConfig = (function() {
    'use strict';

    // Verifica se DataTables está disponível
    if (typeof DataTable === 'undefined') {
        console.warn('DataTables não carregado. Verifique os assets.');
        return;
    }

    // =====================================================
    // CONFIGURAÇÕES PADRÃO SINAGEM
    // =====================================================
    const SINAGEM_CLASSES = {
        // Container principal
        container: 'sinagem-datatable-wrapper',

        // Layout
        layout: {
            row: 'row g-3 align-items-center',
            cell: 'col-12 col-md-6',
        },

        // Busca (Search)
        search: {
            input: 'form-control form-control-sm',
            container: 'dataTables_filter sinagem-search',
            label: 'fs-sm text-muted',
        },

        // Quantidade por página (Length)
        length: {
            select: 'form-select form-select-sm',
            container: 'dataTables_length sinagem-length',
            label: 'fs-sm text-muted',
        },

        // Processamento
        processing: 'dt-processing sinagem-processing',

        // Paginação
        paging: {
            button: 'pagination-btn',
            container: 'dataTables_paginate sinagem-pagination',
            active: 'active',
            disabled: 'disabled',
        },

        // Informação
        info: 'dataTables_info sinagem-info',

        // Botões de exportação
        buttons: {
            container: 'dt-buttons btn-group btn-group-sm',
            button: 'btn btn-outline-primary',
        },
    };

    // =====================================================
    // TEXTO EM PORTUGUÊS (FALLBACK)
    // =====================================================
    const PT_BR_FALLBACK = {
        processing: '<i class="fas fa-spinner fa-spin"></i> Processando...',
        search: '<i class="fas fa-search"></i> Pesquisar:',
        lengthMenu: 'Mostrar _MENU_ registros por página',
        info: 'Mostrando _START_ a _END_ de _TOTAL_ registros',
        infoEmpty: 'Mostrando 0 a 0 de 0 registros',
        infoFiltered: '(filtrado de _MAX_ registros no total)',
        loadingRecords: '<i class="fas fa-spinner fa-spin"></i> Carregando...',
        zeroRecords: '<i class="fas fa-database"></i> Nenhum registro encontrado',
        emptyTable: '<i class="fas fa-table"></i> Nenhum dado disponível na tabela',
        paginate: {
            first: '<i class="fas fa-angle-double-left"></i>',
            previous: '<i class="fas fa-angle-left"></i>',
            next: '<i class="fas fa-angle-right"></i>',
            last: '<i class="fas fa-angle-double-right"></i>'
        },
        aria: {
            sortAscending: ': ativar para ordenar coluna de forma ascendente',
            sortDescending: ': ativar para ordenar coluna de forma descendente'
        }
    };

    // =====================================================
    // CARREGAR IDIOMA (JSON Externo)
    // =====================================================
    async function loadLanguage(path = '/assets/js/datatables/i18n/pt-BR.json') {
        try {
            const response = await fetch(path);
            if (!response.ok) throw new Error(`HTTP ${response.status}`);
            const data = await response.json();
            return { ...PT_BR_FALLBACK, ...data };
        } catch (error) {
            console.warn('Falha ao carregar idioma DataTables:', error);
            return PT_BR_FALLBACK;
        }
    }

    // =====================================================
    // CONFIGURAÇÕES DE COLUNAS
    // =====================================================
    function getColumnDefs(extraDefs = []) {
        const defaultDefs = [
            { targets: 'no-sort', orderable: false },
            { targets: 'no-search', searchable: false },
            { targets: 'text-center', className: 'text-center' },
            { targets: 'text-right', className: 'text-right' },
            { targets: 'text-nowrap', className: 'text-nowrap' },
        ];

        // Adicionar classes específicas SINAGEM
        return [...defaultDefs, ...extraDefs];
    }

    // =====================================================
    // DOM PERSONALIZADO (Layout Bootstrap 5)
    // =====================================================
    function getCustomDom() {
        return `
            <"row g-3 mb-3"
                <"col-sm-12 col-md-6" l>
                <"col-sm-12 col-md-6" f>
            >
            rt
            <"row g-3 mt-3"
                <"col-sm-12 col-md-5" i>
                <"col-sm-12 col-md-7" p>
            >
        `;
    }

    // =====================================================
    // APLICAR ESTILOS PÓS-INICIALIZAÇÃO
    // =====================================================
    function applySinagemStyles(table, element) {
        const wrapper = element.closest('.dataTables_wrapper');
        if (!wrapper) return;

        // Adicionar ícone de busca
        const searchInput = wrapper.querySelector('.dt-search input');
        if (searchInput && !searchInput.parentElement.querySelector('.search-icon')) {
            searchInput.style.paddingLeft = '2rem';
            const icon = document.createElement('i');
            icon.className = 'fas fa-search search-icon';
            icon.style.cssText = 'position: absolute; left: 0.75rem; top: 50%; transform: translateY(-50%); color: var(--text-muted); pointer-events: none;';
            searchInput.parentElement.style.position = 'relative';
            searchInput.parentElement.insertBefore(icon, searchInput);
        }

        // Adicionar classes aos elementos de paginação
        const paginateButtons = wrapper.querySelectorAll('.dt-paging .dt-paging-button');
        paginateButtons.forEach(btn => {
            btn.classList.add('pagination-btn');
        });
    }

    // =====================================================
    // INICIALIZAR DATATABLE
    // =====================================================
    async function init(selector, options = {}) {
        const element = document.querySelector(selector);

        if (!element) {
            console.error(`SINAGEM DataTable: Elemento não encontrado - ${selector}`);
            return null;
        }

        // Verificar se já foi inicializado
        if (element.classList.contains('dt-table-initialized')) {
            console.warn(`SINAGEM DataTable: Tabela já inicializada - ${selector}`);
            return null;
        }

        // Carregar idioma
        const language = await loadLanguage(options.languagePath);

        // Contar linhas para server-side automático
        const rowCount = element.querySelectorAll('tbody tr').length;
        const hasManyRows = rowCount > 100;

        // Configurações padrão SINAGEM
        const defaults = {
            responsive: true,
            autoWidth: false,
            pageLength: options.pageLength || 15,
            lengthMenu: [10, 15, 25, 50, 100, 250],
            ordering: options.ordering !== false,
            searching: options.searching !== false,
            processing: options.processing !== false,
            serverSide: options.serverSide !== undefined ? options.serverSide : hasManyRows,
            language: language,
            dom: options.dom || getCustomDom(),
            classes: SINAGEM_CLASSES,
            columnDefs: getColumnDefs(options.columnDefs || []),
            drawCallback: function(settings) {
                element.classList.add('s-table', 'dt-table-initialized');

                // Reaplicar tooltips do Bootstrap após cada redraw
                if (typeof bootstrap !== 'undefined') {
                    const tooltips = element.querySelectorAll('[data-bs-toggle="tooltip"]');
                    tooltips.forEach(el => {
                        const tooltip = bootstrap.Tooltip.getInstance(el);
                        if (tooltip) tooltip.dispose();
                        new bootstrap.Tooltip(el);
                    });
                }

                // Aplicar estilos SINAGEM
                applySinagemStyles(this, element);
            },
            initComplete: function() {
                element.classList.add('s-table', 'dt-table-initialized');
                applySinagemStyles(this, element);

                // Disparar evento personalizado
                const event = new CustomEvent('datatable:ready', { detail: { tableId: element.id } });
                document.dispatchEvent(event);
            },
        };

        // Mesclar com opções do usuário
        const config = { ...defaults, ...options };

        // Configuração específica para server-side
        if (config.serverSide && options.ajaxUrl) {
            config.ajax = {
                url: options.ajaxUrl,
                type: 'GET',
                data: function(d) {
                    d._token = document.querySelector('meta[name="csrf-token"]')?.getAttribute('content');
                    if (options.extraData) {
                        Object.assign(d, options.extraData);
                    }
                },
                error: function(xhr, status, error) {
                    console.error('Erro no DataTable ServerSide:', error);
                    if (options.onError) options.onError(xhr, status, error);
                },
            };
            config.columns = options.columns || [];
        }

        // Configuração para ordenação padrão
        if (options.order) {
            config.order = options.order;
        }

        // Botões de exportação
        if (options.buttons) {
            config.dom = 'Bfrtip';
            config.buttons = options.buttons;
        }

        try {
            // Destruir instância anterior se existir
            if (window.dataTables && window.dataTables[element.id]) {
                window.dataTables[element.id].destroy();
            }

            // Inicializar DataTable
            const table = new DataTable(element, config);

            // Armazenar referência global
            window.dataTables = window.dataTables || {};
            window.dataTables[element.id] = table;

            console.log(`SINAGEM DataTable: Tabela "${element.id}" inicializada com sucesso`);

            return table;
        } catch (error) {
            console.error(`SINAGEM DataTable: Erro ao inicializar "${element.id}"`, error);
            return null;
        }
    }

    // =====================================================
    // FUNÇÕES AUXILIARES
    // =====================================================

    // Recarregar tabela
    function reload(tableId) {
        const table = window.dataTables?.[tableId];
        if (table) {
            table.ajax.reload();
        }
    }

    // Redesenhar tabela
    function redraw(tableId) {
        const table = window.dataTables?.[tableId];
        if (table) {
            table.draw();
        }
    }

    // Limpar filtros
    function clearFilters(tableId) {
        const table = window.dataTables?.[tableId];
        if (table) {
            table.search('').columns().search('').draw();
        }
    }

    // Destruir tabela
    function destroy(tableId) {
        const table = window.dataTables?.[tableId];
        if (table) {
            table.destroy(true);
            delete window.dataTables[tableId];
        }
    }

    // =====================================================
    // AUTO-INICIALIZAÇÃO (opcional)
    // =====================================================
    function autoInit(selector = '.sinagem-datatable') {
        const tables = document.querySelectorAll(selector);
        tables.forEach(table => {
            if (!table.hasAttribute('data-datatable-initialized')) {
                const options = {};

                // Ler opções do dataset
                if (table.dataset.pageLength) options.pageLength = parseInt(table.dataset.pageLength);
                if (table.dataset.ajaxUrl) options.ajaxUrl = table.dataset.ajaxUrl;
                if (table.dataset.order) options.order = JSON.parse(table.dataset.order);

                init(`#${table.id}`, options);
                table.setAttribute('data-datatable-initialized', 'true');
            }
        });
    }

    // =====================================================
    // EXPORTAR API PÚBLICA
    // =====================================================
    return {
        init,
        reload,
        redraw,
        clearFilters,
        destroy,
        autoInit,
        loadLanguage,
        config: {
            classes: SINAGEM_CLASSES,
            language: PT_BR_FALLBACK,
        },
    };

})();

// =====================================================
// EXPORTAÇÃO (para módulos ES6)
// =====================================================
if (typeof module !== 'undefined' && module.exports) {
    module.exports = SinagemDataTablesConfig;
}

// Auto-inicialização quando o DOM estiver pronto
document.addEventListener('DOMContentLoaded', function() {
    if (typeof SinagemDataTablesConfig !== 'undefined') {
        SinagemDataTablesConfig.autoInit('.sinagem-datatable');
    }
});
