#!/usr/bin/env python3
import json
import os
import traceback
import sys
import time

def application(environ, start_response):
    # --- ROTA DE INTERFACE (GET) ---
    if environ.get('REQUEST_METHOD') == 'GET':
        start_response('200 OK', [('Content-Type', 'text/html; charset=utf-8')])
        return [f"""
<!DOCTYPE html>
<html>
<head>
    <title>LinkTudo - Diagnostic Lab Pro</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <style>
        body {{ background: #0a0a0b; color: #00ffcc; font-family: 'Consolas', monospace; padding: 20px; }}
        .test-box {{ background: #111; border: 1px solid #333; padding: 15px; border-radius: 8px; margin-bottom: 15px; position: relative; }}
        pre {{ background: #000; color: #00ffcc; border: 1px solid #222; padding: 10px; font-size: 11px; max-height: 200px; overflow: auto; }}
        .btn-run {{ background: transparent; color: #00ffcc; border: 1px solid #00ffcc; font-weight: bold; }}
        .btn-run:hover {{ background: #00ffcc; color: #000; }}
        .btn-copy-step {{ position: absolute; top: 15px; right: 15px; background: #222; color: #00ffcc; border: 1px solid #444; font-size: 10px; }}
        .btn-copy-main {{ background: #00ffcc; color: #000; font-weight: bold; width: 100%; padding: 12px; margin: 15px 0; border: none; border-radius: 5px; }}
        .btn-copy-main:hover {{ background: #00ccaa; }}
        .status-msg {{ font-size: 10px; color: #888; margin-bottom: 5px; }}
    </style>
</head>
<body>
    <div class="container" style="max-width: 850px;">
        <h4 class="mb-3">⚡ PARQUET DIAGNOSTIC LAB V5</h4>
        
        <button onclick="copyDiagnostics()" class="btn btn-copy-main">📋 COPIAR DIAGNÓSTICO COMPLETO (TOPO)</button>

        <div class="test-box" id="box-1">
            <div class="status-msg">CAMADA_01 // FILE_SYSTEM</div>
            <h6>1. VERIFICAÇÃO DE DISCO E PERMISSÕES</h6>
            <button onclick="run(1, 'teste_arquivo')" class="btn btn-run btn-sm">EXECUTAR TESTE</button>
            <button onclick="copySingle(1)" class="btn btn-copy-step">Copiar Resultado</button>
            <pre id="out-1" class="mt-2 d-none"></pre>
        </div>

        <div class="test-box" id="box-2">
            <div class="status-msg">CAMADA_02 // PYARROW_METADATA</div>
            <h6>2. LEITURA DE CABEÇALHO (COLUNAS)</h6>
            <button onclick="run(2, 'teste_metadados')" class="btn btn-run btn-sm">EXECUTAR TESTE</button>
            <button onclick="copySingle(2)" class="btn btn-copy-step">Copiar Resultado</button>
            <pre id="out-2" class="mt-2 d-none"></pre>
        </div>

        <div class="test-box" id="box-3">
            <div class="status-msg">CAMADA_03 // FILTER_SCANNER</div>
            <h6>3. CONTAGEM MUNICIPIO 4733 (PESADO)</h6>
            <button onclick="run(3, 'teste_filtro')" class="btn btn-run btn-sm">EXECUTAR TESTE</button>
            <button onclick="copySingle(3)" class="btn btn-copy-step">Copiar Resultado</button>
            <pre id="out-3" class="mt-2 d-none"></pre>
        </div>

        <button onclick="copyDiagnostics()" class="btn btn-copy-main">📋 COPIAR DIAGNÓSTICO COMPLETO (RODAPÉ)</button>
        <div id="copy-notify" class="text-center small text-white" style="display:none; background: #333; padding: 5px;">Copiado para área de transferência!</div>
    </div>

    <script>
    let results = {{
        etapa_1: "Aguardando...",
        etapa_2: "Aguardando...",
        etapa_3: "Aguardando..."
    }};

    async function run(id, action) {{
        const out = document.getElementById('out-' + id);
        out.classList.remove('d-none');
        out.innerText = 'Processando...';
        
        try {{
            const r = await fetch('', {{
                method: 'POST',
                headers: {{'Content-Type': 'application/json'}},
                body: JSON.stringify({{action: action}})
            }});
            const data = await r.json();
            results['etapa_' + id] = data;
            out.innerText = JSON.stringify(data, null, 4);
        }} catch(e) {{
            const errorMsg = "ERRO: Incomplete Response (Timeout ou RAM excedida)";
            results['etapa_' + id] = errorMsg;
            out.innerText = errorMsg;
        }}
    }}

    function copySingle(id) {{
        const text = "ETAPA_" + id + "_RESULT: " + JSON.stringify(results['etapa_' + id], null, 4);
        navigator.clipboard.writeText(text);
        showNotify();
    }}

    function copyDiagnostics() {{
        const text = "DIAGNÓSTICO_GERAL_LINKTUDO:\\n" + JSON.stringify(results, null, 4);
        navigator.clipboard.writeText(text);
        showNotify();
    }}

    function showNotify() {{
        const n = document.getElementById('copy-notify');
        n.style.display = 'block';
        setTimeout(() => n.style.display = 'none', 2000);
    }}
    </script>
</body>
</html>
""".encode('utf-8')]

    # --- ROTA DE PROCESSAMENTO (POST) ---
    if environ.get('REQUEST_METHOD') == 'POST':
        start_response('200 OK', [('Content-Type', 'application/json; charset=utf-8')])
        try:
            length = int(environ.get('CONTENT_LENGTH', 0))
            body = json.loads(environ['wsgi.input'].read(length).decode('utf-8'))
            action = body.get('action')
            path = "/home/link6350/arquivos_restritos/banco_de_dados/parquet/cnpj/tabelas_auxiliares_pesadas/cnpj___tb_aux___estabelecimentos___por_cnae_por_logradouro___mais_agregacoes___para_filtro_personalizado___cliente_final.parquet"

            if action == 'teste_arquivo':
                s = os.stat(path)
                return [json.dumps({"existe": True, "tamanho_gb": round(s.st_size/(1024**3), 2), "permissoes": oct(s.st_mode)}).encode('utf-8')]

            if action == 'teste_metadados':
                import pyarrow.parquet as pq
                meta = pq.read_metadata(path)
                return [json.dumps({"total_linhas": meta.num_rows, "colunas": meta.schema.names}).encode('utf-8')]

            if action == 'teste_filtro':
                import pyarrow.parquet as pq
                # Forçamos a leitura de apenas 1 coluna para tentar passar no limite de RAM
                tabela = pq.read_table(path, columns=['municipio_codigo'], filters=[('municipio_codigo', '==', '4733')])
                return [json.dumps({"total_encontrado_4733": tabela.num_rows}).encode('utf-8')]

        except Exception as e:
            return [json.dumps({"status": "error", "message": str(e), "traceback": traceback.format_exc()}).encode('utf-8')]

    return [b"Metodo nao permitido"]