<!DOCTYPE html>
<html lang="pt-BR">
<head>
    <meta charset="UTF-8">
    <title>Calculadora do Ecossistema TOTVS Agro Bioenergia</title>
    <style>
        body {
            font-family: 'Segoe UI', Arial, sans-serif;
            margin: 40px;
            background: #f4f8fb;
            color: #080808;
        }
        h1 {
            color: #080808;
            background: #e3f2fd;
            padding: 16px;
            border-radius: 8px;
            margin-bottom: 30px;
            box-shadow: 0 2px 8px #f4f4f51a;
        }
        label {
            color: #0a0a0a;
            font-weight: bold;
            margin-right: 10px;
        }
        select {
            padding: 6px 12px;
            border: 1px solid #90caf9;
            border-radius: 6px;
            background: #e3f2fd;
            color: #0d0d0e;
            margin-bottom: 20px;
            margin-right: 20px;
            font-size: 1em;
        }
        h2 {
            background: #bbdefb;
            color: #0a0a0a;
            padding: 10px;
            border-radius: 6px;
            margin-top: 30px;
            margin-bottom: 10px;
        }
        table {
            border-collapse: collapse;
            width: 100%;
            margin-bottom: 40px;
            background: #e3f2fd;
            border-radius: 8px;
            overflow: hidden;
            box-shadow: 0 2px 8px #1565c01a;
        }
        th, td {
            border: 1px solid #90caf9;
            padding: 10px;
            text-align: left;
        }
        th {
            background: #0c0c0c;
            color: #fff;
            font-weight: bold;
        }
        tr:nth-child(even) td {
            background: #f4f8fb;
        }
        tr:hover td {
            background: #bbdefb;
        }
        .produto {
            font-weight: bold;
            background: #030303;
        }
        @media (max-width: 700px) {
            body { margin: 10px; }
            table, th, td { font-size: 0.95em; }
            h1 { font-size: 1.3em; }
        }
    </style>
</head>
<body>

    <br><br>
    <label for="produtoFiltroSelect">Produto:</label>
    <select id="produtoFiltroSelect"></select>
    <label for="userTotalSelect">Usuários (total):</label>
    <select id="userTotalSelect"></select>    
	<br><br>
    <div id="tables"></div>
    <script>
        const csvData = `
Produto,UsuariosTotal,UsuariosConcorrentes,Requisito,Descricao,Valor 
Bioenergia,250-600,200,Servidor aplicação,Processador,8 VCPU - 2 processadores  Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz / GenuineIntel / Speed 3.00 GHz / Cores 4 / Theads 4 / Model 63 / Stepping 0
Bioenergia,1000-1500,500,Servidor aplicação,SO,Windows Server 2019
Bioenergia,1000-1500,500,Servidor aplicação,Memória,16 GB
Bioenergia,1000-1500,500,Servidor aplicação,Disco,300 GB
Bioenergia,1000-1500,500,Servidor aplicação,Servidores,1
Bioenergia,1000-1500,500,Servidor Go Global,Servidores,50
Bioenergia,1000-1500,500,Banco de Dados,Versão,Oracle Server 19c
Bioenergia,1000-1500,500,Banco de Dados,Processador,"Intel Xeon Gold 6248R (3.00 GHz, 24 núcleos/48 threads, 35.75MB Cache, TDP 205W) ou superior"
Bioenergia,1000-1500,500,Banco de Dados,Memória,32 GB
Bioenergia,1000-1500,500,Banco de Dados,Disco,2 TB
Bioenergia,1000-1500,500,Banco de Dados,Servidores,1
Pesagem Offline,1000-1500,500,Servidor aplicação,Processador,12 VCPU – 2 processadores  Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz / GenuineIntel / Speed 3.00 GHz / Cores 6 / Theads 6 / Model 63 / Stepping 0
Pesagem Offline,1000-1500,500,Servidor aplicação,SO,Windows Server 2019
Pesagem Offline,1000-1500,500,Servidor aplicação,Memória,32GB RAM
Pesagem Offline,1000-1500,500,Servidor aplicação,Disco,300GB Disco
Pesagem Offline,1000-1500,500,Servidor aplicação,Servidores,1
PIMS Server,1000-1500,500,Servidor aplicação,Processador,16 VCPU – 2 processadores  Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz / GenuineIntel / Speed 3.00 GHz / Cores 6 / Theads 6 / Model 63 / Stepping 0
PIMS Server,1000-1500,500,Servidor aplicação,SO,Windows Server 2019
PIMS Server,1000-1500,500,Servidor aplicação,Memória,48GB RAM
PIMS Server,1000-1500,500,Servidor aplicação,Disco,500GB Disco
PIMS Server,1000-1500,500,Servidor aplicação,Servidores,1
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,Processador,4 VCPU – 
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,SO,Windows 11
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,Memória,12 GB RAM
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,Disco,200GB Disco
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,Quantidade Estações,De acordo com a quantidade de balança
Pesagem Offline  (Cliente),1000-1500,500,Estacão Cliente,Banco de Dados,PostgreSQL 14
Bioenergia,600-1000,400,Servidor aplicação,Processador,8 VCPU
Bioenergia,600-1000,400,Servidor aplicação,SO,Windows Server 2019
Bioenergia,600-1000,400,Servidor aplicação,Memória,16 GB
Bioenergia,600-1000,400,Servidor aplicação,Disco,300 GB
Bioenergia,600-1000,400,Servidor aplicação,Servidores,1
Bioenergia,600-1000,400,Servidor Go Global,Servidores,35
Bioenergia,600-1000,400,Banco de Dados,Versão,Oracle Server 19c
Bioenergia,600-1000,400,Banco de Dados,Processador,"Intel Xeon Gold 6248R (3.00 GHz, 24 núcleos/48 threads, 35.75MB Cache, TDP 205W) ou superior"
Bioenergia,600-1000,400,Banco de Dados,Memória,32 GB
Bioenergia,600-1000,400,Banco de Dados,Disco,"1,5 TB"
Bioenergia,600-1000,400,Banco de Dados,Servidores,1
Pesagem Offline,600-1000,400,Servidor aplicação,Processador,10 VCPU
Pesagem Offline,600-1000,400,Servidor aplicação,SO,Windows Server 2019
Pesagem Offline,600-1000,400,Servidor aplicação,Memória,24 GB RAM
Pesagem Offline,600-1000,400,Servidor aplicação,Disco,300GB Disco
Pesagem Offline,600-1000,400,Servidor aplicação,Servidores,1
PIMS Server,600-1000,400,Servidor aplicação,Processador,12 VCPU 
PIMS Server,600-1000,400,Servidor aplicação,SO,Windows Server 2019
PIMS Server,600-1000,400,Servidor aplicação,Memória,36 GB RAM
PIMS Server,600-1000,400,Servidor aplicação,Disco,500GB Disco
PIMS Server,600-1000,400,Servidor aplicação,Servidores,1
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,Processador,4 VCPU – 
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,SO,Windows 11
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,Memória,12 GB RAM
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,Disco,200GB Disco
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,Quantidade Estações,De acordo com a quantidade de balança
Pesagem Offline  (Cliente),600-1000,400,Estacão Cliente,Banco de Dados,PostgreSQL 14
Bioenergia,250-600,200,Servidor aplicação,Processador,8 VCPU 
Bioenergia,250-600,200,Servidor aplicação,SO,Windows Server 2019
Bioenergia,250-600,200,Servidor aplicação,Memória,16 GB
Bioenergia,250-600,200,Servidor aplicação,Disco,300 GB
Bioenergia,250-600,200,Servidor aplicação,Servidores,1
Bioenergia,250-600,200,Servidor Go Global,Servidores,20
Bioenergia,250-600,200,Banco de Dados,Versão,Oracle Server 19c
Bioenergia,250-600,200,Banco de Dados,Processador,"Intel Xeon Gold 6248R (3.00 GHz, 24 núcleos/48 threads, 35.75MB Cache, TDP 205W) ou superior"
Bioenergia,250-600,200,Banco de Dados,Memória,24 GB
Bioenergia,250-600,200,Banco de Dados,Disco,1 TB
Bioenergia,250-600,200,Banco de Dados,Servidores,1
Pesagem Offline,250-600,200,Servidor aplicação,Processador,8 VCPU
Pesagem Offline,250-600,200,Servidor aplicação,SO,Windows Server 2019
Pesagem Offline,250-600,200,Servidor aplicação,Memória,16GB RAM
Pesagem Offline,250-600,200,Servidor aplicação,Disco,300GB Disco
Pesagem Offline,250-600,200,Servidor aplicação,Servidores,1
PIMS Server,250-600,200,Servidor aplicação,Processador,10 VCPU
PIMS Server,250-600,200,Servidor aplicação,SO,Windows Server 2019
PIMS Server,250-600,200,Servidor aplicação,Memória,24 GB RAM
PIMS Server,250-600,200,Servidor aplicação,Disco,500GB Disco
PIMS Server,250-600,200,Servidor aplicação,Servidores,1
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,Processador,4 VCPU – 
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,SO,Windows 11
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,Memória,12 GB RAM
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,Disco,200GB Disco
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,Quantidade Estações,De acordo com a quantidade de balança
Pesagem Offline  (Cliente),250-600,200,Estacão Cliente,Banco de Dados,PostgreSQL 14
Bioenergia,1-250,50,Servidor aplicação,Processador,6 VCPU
Bioenergia,1-250,50,Servidor aplicação,SO,Windows Server 2019
Bioenergia,1-250,50,Servidor aplicação,Memória,16 GB
Bioenergia,1-250,50,Servidor aplicação,Disco,300 GB
Bioenergia,1-250,50,Servidor aplicação,Servidores,1
Bioenergia,1-250,50,Servidor Go Global,Servidores,10
Bioenergia,1-250,50,Banco de Dados,Versão,Oracle Server 19c
Bioenergia,1-250,50,Banco de Dados,Processador,"Intel Xeon Gold 6248R (3.00 GHz, 24 núcleos/48 threads, 35.75MB Cache, TDP 205W) ou superior"
Bioenergia,1-250,50,Banco de Dados,Memória,16 GB
Bioenergia,1-250,50,Banco de Dados,Disco,500 GB
Bioenergia,1-250,50,Banco de Dados,Servidores,1
Pesagem Offline,1-250,50,Servidor aplicação,Processador,06 VCPU 
Pesagem Offline,1-250,50,Servidor aplicação,SO,Windows Server 2019
Pesagem Offline,1-250,50,Servidor aplicação,Memória,08 GB RAM
Pesagem Offline,1-250,50,Servidor aplicação,Disco,300GB Disco
Pesagem Offline,1-250,50,Servidor aplicação,Servidores,1
PIMS Server,1-250,50,Servidor aplicação,Processador,08 VCPU
PIMS Server,1-250,50,Servidor aplicação,SO,Windows Server 2019
PIMS Server,1-250,50,Servidor aplicação,Memória,16GB RAM
PIMS Server,1-250,50,Servidor aplicação,Disco,300GB Disco
PIMS Server,1-250,50,Servidor aplicação,Servidores,1
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,Processador,4 VCPU – 
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,SO,Windows 11
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,Memória,12 GB RAM
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,Disco,200GB Disco
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,Quantidade Estações,De acordo com a quantidade de balança
Pesagem Offline  (Cliente),1-250,50,Estacão Cliente,Banco de Dados,PostgreSQL 14
Indústria,1-250,50,Servidor aplicação,Processador,6 VCPU
Indústria,1-250,50,Servidor aplicação,SO,Windows Server 2019
Indústria,1-250,50,Servidor aplicação,Memória,12 GB
Indústria,1-250,50,Servidor aplicação,Disco,300 GB
Indústria,1-250,50,Servidor aplicação,Servidores,1
Indústria,1-250,50,Servidor Go Global,Servidores,10
Indústria,250-600,200,Servidor aplicação,Processador,8 VCPU 
Indústria,250-600,200,Servidor aplicação,SO,Windows Server 2019
Indústria,250-600,200,Servidor aplicação,Memória,16 GB
Indústria,250-600,200,Servidor aplicação,Disco,300 GB
Indústria,250-600,200,Servidor aplicação,Servidores,1
Indústria,250-600,200,Servidor Go Global,Servidores,20
Indústria,600-1000,400,Servidor aplicação,Processador,8 VCPU
Indústria,600-1000,400,Servidor aplicação,SO,Windows Server 2019
Indústria,600-1000,400,Servidor aplicação,Memória,16 GB
Indústria,600-1000,400,Servidor aplicação,Disco,300 GB
Indústria,600-1000,400,Servidor aplicação,Servidores,1
Indústria,600-1000,400,Servidor Go Global,Servidores,35
Indústria,1000-1500,500,Servidor aplicação,Processador,8 VCPU - 2 processadores  Intel(R) Xeon(R) Gold 6248R CPU @ 3.00GHz / GenuineIntel / Speed 3.00 GHz / Cores 4 / Theads 4 / Model 63 / Stepping 0
Indústria,1000-1500,500,Servidor aplicação,SO,Windows Server 2019
Indústria,1000-1500,500,Servidor aplicação,Memória,16 GB
Indústria,1000-1500,500,Servidor aplicação,Disco,300 GB
Indústria,1000-1500,500,Servidor aplicação,Servidores,1
Indústria,1000-1500,500,Servidor Go Global,Servidores,50
TOTVS Agro LGPD,-,Sem Variação,Servidor aplicação,Processador,"4 VCPU - Intel® Xeon® Gold 5415+ Processor (22.5M Cache, 2.90 GHz)"
TOTVS Agro LGPD,-,Sem Variação,Servidor aplicação,SO,Windows Server 2019 & Red Hat 8 ou Superior
TOTVS Agro LGPD,-,Sem Variação,Servidor aplicação,Memória,8 GB
TOTVS Agro LGPD,-,Sem Variação,Servidor aplicação,Disco,20 GB
TOTVS Agro LGPD,-,Sem Variação,Banco de Dados,Versão,PostgreSQL 14 & Oracle 19c
TOTVS Agro LGPD,-,Sem Variação,Banco de Dados,Servidores,1
TOTVS Agro Conector Client,-,Sem Variação,Servidor aplicação,Processador,"4 VCPU - Intel® Xeon® Gold 5415+ Processor (22.5M Cache, 2.90 GHz)"
TOTVS Agro Conector Client,-,Sem Variação,Servidor aplicação,SO,Windows Server 2019 & Red Hat 8 ou Superior
TOTVS Agro Conector Client,-,Sem Variação,Servidor aplicação,Memória,8 GB
TOTVS Agro Conector Client,-,Sem Variação,Servidor aplicação,Disco,20 GB
TOTVS Agro Conector Client,-,Sem Variação,Banco de Dados,Versão,PostgreSQL 14 & Oracle 19c
TOTVS Agro Conector Client,-,Sem Variação,Banco de Dados,Servidores,1
TOTVS Agro API HUB,-,Sem Variação,Servidor aplicação,Processador,"CPU Intel® Xeon® Gold 5415+ Processor (22.5M Cache, 2.90 GHz) / 4 vCPU"
TOTVS Agro API HUB,-,Sem Variação,Servidor aplicação,SO,Windows Server 2019 & Red Hat 8 ou Superior
TOTVS Agro API HUB,-,Sem Variação,Servidor aplicação,Memória,12 GB
TOTVS Agro API HUB,-,Sem Variação,Servidor aplicação,Disco,30 GB
TOTVS Agro API HUB,-,Sem Variação,Banco de Dados,Versão,PostgreSQL 14 & Oracle 19c`.trim();

        // Função para obter os produtos únicos
        function getProdutoOptions(data) {
            const set = new Set();
            data.forEach(row => set.add(row['Produto']));
            return Array.from(set).filter(v => v && v !== '').sort();
        }

        function parseCSV(text) {
            const lines = text.split(/\r?\n/).filter(l => l.trim());
            const header = lines[0].split(',');
            return lines.slice(1).map(line => {
                const regex = /(".*?"|[^",]+)(?=\s*,|\s*$)/g;
                const matches = line.match(regex) || [];
                return header.reduce((obj, key, i) => {
                    obj[key.trim()] = (matches[i] || '').replace(/^"|"$/g, '').replace(/""/g, '"');
                    return obj;
                }, {});
            });
        }

        function groupByUserTotal(data, produtoFiltro) {
            const groups = {};
            data.forEach(row => {
                if (produtoFiltro && row['Produto'] !== produtoFiltro) return;
                const userTotal = row['UsuariosTotal'] || '-';
                if (!groups[userTotal]) groups[userTotal] = [];
                groups[userTotal].push(row);
            });
            return groups;
        }

        function getUserTotalOptions(data, produtoFiltro) {
            const set = new Set();
            data.forEach(row => {
                if (produtoFiltro && row['Produto'] !== produtoFiltro) return;
                set.add(row['UsuariosTotal'] || '-');
            });
            // Remova o filtro para incluir o "-"
            return Array.from(set)
                .sort((a, b) => {
                    // '-' sempre vai para o final
                    if (a === '-') return 1;
                    if (b === '-') return -1;
                    const getMin = str => {
                        const match = str.match(/(\d+)/);
                        return match ? parseInt(match[1], 10) : Number.MAX_SAFE_INTEGER;
                    };
                    return getMin(a) - getMin(b);
                });
        }

        function renderTables(groups, selectedUserTotal, produtoFiltro) {
            const container = document.getElementById('tables');
            container.innerHTML = '';
            const group = groups[selectedUserTotal];
            if (!group) {
                container.innerHTML = '<p>Nenhum dado para este grupo.</p>';
                return;
            }
            const h2 = document.createElement('h2');     
		h2.innerHTML = `<div style="margin-bottom:16px;">
        <strong>Produto:</strong> ${produtoFiltro}
        <strong>Usuários (total):</strong> ${selectedUserTotal}
    </div>`;container.appendChild(h2);

            const table = document.createElement('table');
            const thead = document.createElement('thead');
            thead.innerHTML = `<tr>
                <th>Produto</th>
                <th>Usuários (concorrentes)</th>
                <th>Requisito</th>
                <th>Descrição</th>
                <th>Valor</th>
            </tr>`;
            table.appendChild(thead);

            const tbody = document.createElement('tbody');
            group.forEach(row => {
                const tr = document.createElement('tr');
                tr.innerHTML = `
                    <td>${row['Produto']}</td>
                    <td style="text-align:center;">${row['UsuariosConcorrentes']}</td>
                    <td>${row['Requisito']}</td>
                    <td>${row['Descricao']}</td>
				    <td>${row['Valor']}</td>
                `;
                tbody.appendChild(tr);
            });
            table.appendChild(tbody);
            container.appendChild(table);
        }

        // Executa ao carregar
        const data = parseCSV(csvData);
        const produtoOptions = getProdutoOptions(data);

        const produtoSelect = document.getElementById('produtoFiltroSelect');
        produtoOptions.forEach(opt => {
            const option = document.createElement('option');
            option.value = opt;
            option.textContent = opt;
            produtoSelect.appendChild(option);
        });

        let produtoFiltro = produtoSelect.value;

        function updateUserTotalSelect() {
            const userTotalOptions = getUserTotalOptions(data, produtoFiltro);
            const select = document.getElementById('userTotalSelect');
            select.innerHTML = '';
            userTotalOptions.forEach(opt => {
                const option = document.createElement('option');
                option.value = opt;
                option.textContent = opt;
                select.appendChild(option);
            });
        }

        function updateTable() {
            const userTotal = document.getElementById('userTotalSelect').value;
            const groups = groupByUserTotal(data, produtoFiltro);
            renderTables(groups, userTotal, produtoFiltro);
        }

        produtoSelect.addEventListener('change', function() {
            produtoFiltro = produtoSelect.value;
            updateUserTotalSelect();
            updateTable();
        });

        document.getElementById('userTotalSelect').addEventListener('change', function() {
            updateTable();
        });

        updateUserTotalSelect();
        updateTable();
    </script>
<br><br> <br><br>
  </body>
</html>