import os
import fitz
import logging
import re
from datetime import datetime
from database import AsyncSessionLocal
from models import Fatura, LogProcessamento
from calculos import calcular_campos_dinamicos
from layouts.equatorial_go import extrair_dados as extrair_dados_equatorial
from sqlalchemy.future import select

logger = logging.getLogger(__name__)

def extrair_dados_pdf(caminho_pdf):
    try:
        with fitz.open(caminho_pdf) as doc:
            texto_final = ""
            for page in doc:
                blocos = page.get_text("blocks")
                blocos.sort(key=lambda b: (b[1], b[0]))
                for b in blocos:
                    texto_final += b[4] + "\n"

        if not texto_final.strip():
            raise ValueError("PDF não contém texto legível")

        dados_extraidos = extrair_dados_equatorial(texto_final)
        return dados_extraidos

    except Exception as e:
        raise ValueError(f"Erro ao processar PDF: {str(e)}")

async def nota_ja_existente(nota_fiscal, uc):
    async with AsyncSessionLocal() as session:
        result = await session.execute(
            select(Fatura).filter_by(nota_fiscal=nota_fiscal, unidade_consumidora=uc)
        )
        return result.scalar_one_or_none() is not None

async def adicionar_fatura(dados, caminho_pdf):
    async with AsyncSessionLocal() as session:
        try:
            dados_calculados = await calcular_campos_dinamicos(dados, session)
            fatura = Fatura(**dados_calculados)
            fatura.arquivo = os.path.basename(caminho_pdf)
            fatura.link_arquivo = os.path.abspath(caminho_pdf)
            fatura.data_processamento = datetime.now()

            session.add(fatura)

            log = LogProcessamento(
                status="PROCESSAMENTO",
                mensagem=f"Fatura adicionada com sucesso: {fatura.nota_fiscal} - {fatura.nome}",
                nome_arquivo=os.path.basename(caminho_pdf)
            )
            session.add(log)

            await session.commit()
            logger.info(log.mensagem)
            return True

        except Exception as e:
            logger.error(f"Erro ao adicionar fatura no banco: {e}")
            await session.rollback()
            raise
