import re
import psycopg2
from psycopg2.extras import RealDictCursor
from fasthtml.common import *

# 1. CSS Global passado nos cabeçalhos da aplicação (evita renderizar a tag <style> a cada requisição HTMX)
css_personalizado = Style("""
/* Container da tabela para garantir os cantos arredondados sem vazamento */
body {
    overflow-x: hidden; /* Evita rolagem horizontal indesejada */
}
.tabela-container {
    border: 2px solid #0D6EFD !important;
    border-radius: 12px !important;
    overflow: hidden !important; /* Corta os cantos internos */
}

.tabela-com-moldura {
    width: 100% !important;
    border-collapse: separate !important; /* Permite cantos arredondados */
    border-spacing: 0 !important;
    margin: 0 !important;
}

/* Linha vertical separando cada coluna (em todas as células) */
.tabela-com-moldura th:not(:last-child),
.tabela-com-moldura td:not(:last-child) {
    border-right: 1px solid #ccc !important;
}

/* Linha horizontal para separar as linhas da tabela */
.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; /* Remove a linha do fundo da última linha */
}

/* Títulos das colunas com a cor #0D6EFD */
.tabela-com-moldura th {
    color: #0D6EFD !important;
    font-weight: bold !important;
}
""")

# Inicialização do FastHTML injetando o CSS nos headers
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_produto(termo: str = ""):
    """Consulta os produtos na tabela produtoia."""
    termo_limpo = termo.strip()
    try:
        conn = psycopg2.connect(**DB_CONFIG)
        cursor = conn.cursor(cursor_factory=RealDictCursor)

        query = """
            SELECT cp1codig AS "Codigo", cp1descr AS "Descricao", cp1ref99 AS "Referencia" 
            FROM produtoia
            WHERE descricaoc ILIKE %s 
            LIMIT 100;
        """
        cursor.execute(query, (f"%{termo_limpo}%",))
        produtos = cursor.fetchall()

        cursor.close()
        conn.close()
        return produtos
    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 render_tabela(produtos, termo: str = ""):
    """Gera a tabela HTML com os botões de seleção."""
    if not produtos:
        return P("Nenhum produto encontrado.", style="color: gray; padding: 10px;")

    colunas = list(produtos[0].keys())
    header = Tr(*[Th(col.replace("_", " ").title()) for col in colunas])

    linhas = []
    for prod in produtos:
        celulas = []
        for col in colunas:
            valor_original = str(prod[col] if prod[col] is not None else "")
            valor_formatado = destacar_termo(valor_original, termo)

            if col == "Codigo":
                # Botão de imagem com dimensões cravadas para não quebrar layout no onerror
                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;",
                    ),
                    hx_get=f"/selecionar-codigo?codigo={valor_original}",
                    hx_target="#container-modal",
                )
                celulas.append(Td(botao_seleciona, NotStr(valor_formatado)))
            else:
                celulas.append(Td(NotStr(valor_formatado)))

        linhas.append(Tr(*celulas))

    # Tabela envolvida na Div com estilo explícito da moldura azul `#0D6EFD`
    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;",
    )