-- Filtr dla Pandoc 3.1.x (EPUB Table to List)
-- Rozwiązuje problem struktury TableBody.body

function Table(el)
    -- 1. Obsługuj tylko formaty EPUB
    if not FORMAT:match('epub') then
        return nil
    end

    io.stderr:write("--------------------------------------\n")
    io.stderr:write("INFO: Rozpoczynam transformację tabeli...\n")

    local headers = {}
    local result_blocks = {}

    -- 2. Pobierz nagłówki (TableHead -> rows -> cells)
    if el.head and el.head.rows and #el.head.rows > 0 then
        for _, cell in ipairs(el.head.rows[1].cells) do
            table.insert(headers, pandoc.utils.stringify(cell.contents))
        end
        io.stderr:write("DEBUG: Znaleziono nagłówki: " .. #headers .. "\n")
    end

    -- 3. Przetwarzaj ciała tabeli (TableBody)
    -- W Pandoc 3.x wiersze danych są w body.body, a nie body.rows!
    local total_rows = 0
    for _, table_body in ipairs(el.bodies or {}) do
        -- table_body.body to lista wierszy (Rows)
        local rows = table_body.body or {}
        for _, row in ipairs(rows) do
            total_rows = total_rows + 1
            local list_items = {}
            
            -- row.cells to lista komórek (Cells)
            for i, cell in ipairs(row.cells or {}) do
                local label = headers[i] or "Informacja"
                local label_strong = pandoc.Strong({pandoc.Str(label .. ": ")})
                
                -- Pobieramy zawartość komórki (bloków)
                local cell_content = cell.contents
                
                -- Budujemy nowy akapit z nagłówkiem na początku
                local new_inlines = {label_strong}
                
                -- Wyciągamy istniejące inliny z pierwszego bloku komórki
                if #cell_content > 0 then
                    for _, block in ipairs(cell_content) do
                        if block.content then
                            for _, inline in ipairs(block.content) do
                                table.insert(new_inlines, inline)
                            end
                        else
                            -- Jeśli blok to np. Plain bez pola content
                            table.insert(new_inlines, pandoc.Str(pandoc.utils.stringify(block)))
                        end
                    end
                end
                
                table.insert(list_items, {pandoc.Plain(new_inlines)})
            end
            
            if #list_items > 0 then
                table.insert(result_blocks, pandoc.BulletList(list_items))
                table.insert(result_blocks, pandoc.HorizontalRule())
            end
        end
    end

    if #result_blocks > 0 then
        io.stderr:write("SUKCES: Przetworzono " .. total_rows .. " wierszy tabeli.\n")
        io.stderr:write("--------------------------------------\n")
        return result_blocks
    else
        io.stderr:write("BŁĄD: Nie znaleziono wierszy w strukturze el.bodies[].body\n")
        io.stderr:write("--------------------------------------\n")
        return nil
    end
end