import re
import psycopg2
from psycopg2.extras import RealDictCursor
from fasthtml.common import *

# CSS Global
css_personalizado = Style("""
body {
    overflow-x: hidden;
}
.tabela-container {
    border: 2px solid #0D6EFD !important;
    border-radius: 12px !important;
    overflow: hidden !important;
}

.tabela-com-moldura {
    width: 100% !important;
    border-collapse: separate !important;
    border-spacing: 0 !important;
    margin: 0 !important;
}

.tabela-com-moldura th:not(:last-child),
.tabela-com-moldura td:not(:last-child) {
    border-right: 1px solid #ccc !important;
}

.tabela-com-moldura th, 
.tabela-com-moldura td {
    border-bottom: 1px solid #eee !important;
}

.tabela-com-moldura tr:last-child td {
    border-bottom: none !important;
}

.tabela-com-moldura th {
    color: #0D6EFD !important;
    font-weight: bold !important;
}
""")

app, rt = fast_app(hdrs=(css_personalizado,))

DB_CONFIG = {
    "dbname": "bdps01",
    "user": "postgres",
    "password": "ps@web",
    "host": "127.0.0.1",
    "port": 5432,
}

def buscar_posic(termo: str = ""):
    """Consulta os posicionamentos na tabela vw_posic."""
    termo_limpo = termo.strip()
    try:
        conn = psycopg2.connect(**DB_CONFIG)
        conn.set_client_encoding('WIN1252')
        cursor = conn.cursor(cursor_factory=RealDictCursor)

        query = """
            SELECT posicionamento AS "Codigo", descricao_posicionamento AS "Descricao"
            FROM vw_posic
            WHERE descricao_posicionamento ILIKE %s
            ORDER BY descricao_posicionamento
            LIMIT 50;
        """
        parametro = (f"%{termo_limpo}%",)

        try:
            query_bytes = cursor.mogrify(query, parametro)
            print("\n--- QUERY SENDO EXECUTADA ---")
            print(query_bytes.decode('utf-8', errors='replace'))
            print("-----------------------------\n")
        except Exception as err_print:
            print(f"Aviso: Não foi possível imprimir a query formatada: {err_print}")

        cursor.execute(query, parametro)
        posic_po1 = cursor.fetchall()

        cursor.close()
        conn.close()
        return posic_po1
    except Exception as e:
        print(f"Erro na consulta SQL: {e}")
        return []

def destacar_termo(texto: str, termo: str) -> str:
    """Destaca o termo buscado na tabela."""
    termo_limpo = termo.strip()
    if not termo_limpo or not texto:
        return str(texto)
    padrao = re.compile(f"({re.escape(termo_limpo)})", re.IGNORECASE)
    return padrao.sub(r"<strong>\1</strong>", str(texto))

def formatar_codigo_posic(codigo: str) -> str:
    """Formata uma string numérica/limpa para a máscara 99.99.99.99."""
    if not codigo:
        return ""
    # Remove qualquer caractere que não seja dígito para padronizar
    apenas_numeros = re.sub(r'\D', '', str(codigo)).zfill(8)
    
    # Aplica a máscara 99.99.99.99 nos primeiros 8 dígitos
    if len(apenas_numeros) >= 8:
        return f"{apenas_numeros[:2]}.{apenas_numeros[2:4]}.{apenas_numeros[4:6]}.{apenas_numeros[6:8]}"
    return codigo

def render_tabela_po1(posic_po1, termo: str = ""):
    """Gera a tabela HTML com os botões de seleção."""
    if not posic_po1:
        return P("Nenhum posicionamento encontrado.", style="color: gray; padding: 10px;")

    colunas = list(posic_po1[0].keys())
    header = Tr(*[Th(col.replace("_", " ").title()) for col in colunas])

    linhas = []
    for prod in posic_po1:
        celulas = []
        for col in colunas:
            valor_original = str(prod[col] if prod[col] is not None else "")

            if col == "Codigo":
                # Aplica a máscara 99.99.99.99 no valor exibido na tela
                valor_com_mascara = formatar_codigo_posic(valor_original)
                valor_formatado = destacar_termo(valor_com_mascara, termo)

                botao_seleciona = A(
                    Button(
                        Img(
                            src=f"/static/{valor_original}.jpg",
                            alt=f"Código {valor_original}",
                            width="40",
                            height="40",
                            style="width: 40px; height: 40px; object-fit: cover; vertical-align: middle; border-radius: 6px;",
                            onerror="this.onerror=null; this.src='/static/logoia.jpg';",
                        ),
                        cls="outline",
                        style="margin-right: 10px; padding: 2px 8px; font-size: 0.85rem;",
                    ),
                    # Passa o código com máscara para o evento de seleção
                    hx_get=f"/selecionar-posic?codigo={valor_com_mascara}",
                    hx_target="#container-modal",
                )
                celulas.append(Td(botao_seleciona, NotStr(valor_formatado)))
            else:
                valor_formatado = destacar_termo(valor_original, termo)
                celulas.append(Td(NotStr(valor_formatado)))

        linhas.append(Tr(*celulas))

    return Div(
        Table(
            Thead(header),
            Tbody(*linhas),
            cls="striped tabela-com-moldura",
        ),
        cls="tabela-container",
        style="border: 2px solid #0D6EFD; border-radius: 12px; overflow: hidden;",
    )
    return Div(
        Table(
            Thead(header),
            Tbody(*linhas),
            cls="striped tabela-com-moldura",
        ),
        cls="tabela-container",
        style="border: 2px solid #0D6EFD; border-radius: 12px; overflow: hidden;",
    )