import sys
import json
from docx import Document
import subprocess
import os
import time
import atexit
import traceback
import shutil
import tempfile
from datetime import datetime
import unicodedata
import re

# -------------------------------------------------
# BASE
# -------------------------------------------------
BASE_DIR = os.path.dirname(os.path.abspath(__file__))

# -------------------------------------------------
# LOG
# -------------------------------------------------
LOG_FILE = os.path.join(BASE_DIR, "log.txt")

def log(msg):
    with open(LOG_FILE, "a", encoding="utf-8") as f:
        f.write(f"[{time.strftime('%Y-%m-%d %H:%M:%S')}] {msg}\n")

# -------------------------------------------------
# CONFIG LIBREOFFICE
# -------------------------------------------------
SOFFICE = shutil.which("soffice")
if not SOFFICE:
    raise RuntimeError("LibreOffice (soffice) não encontrado no sistema")

PROFILE_DIR = tempfile.mkdtemp(prefix="lo-profile-")

# -------------------------------------------------
# CAMINHOS DE SAÍDA
# -------------------------------------------------
DATA_HOJE = datetime.now().strftime("%Y%m%d")

PASTA_FICHAS = os.path.join(BASE_DIR, "fichas")
PASTA_DIA = os.path.join(PASTA_FICHAS, DATA_HOJE)

os.makedirs(PASTA_DIA, exist_ok=True)

# -------------------------------------------------
def normalizar_nome(nome):
    if not nome:
        return "SEM_NOME"

    # Remove acentos
    nome = unicodedata.normalize('NFKD', nome)
    nome = nome.encode('ascii', 'ignore').decode('ascii')

    # Substitui tudo que não for letra ou número por _
    nome = re.sub(r'[^A-Za-z0-9]+', '_', nome)

    # Remove _ duplicados e bordas
    nome = re.sub(r'_+', '_', nome).strip('_')

    return nome.upper()

def substituir_tags(docx_entrada, docx_saida, dados):
    log(f"Abrindo template: {docx_entrada}")

    if not os.path.exists(docx_entrada):
        raise RuntimeError("template.docx não encontrado")

    doc = Document(docx_entrada)

    def substituir_em_runs(paragrafos):
        for p in paragrafos:
            for run in p.runs:
                for k, v in dados.items():
                    tag = f"${{{k}}}"
                    if tag in run.text:
                        run.text = run.text.replace(tag, str(v))

    substituir_em_runs(doc.paragraphs)

    for tabela in doc.tables:
        for linha in tabela.rows:
            for celula in linha.cells:
                substituir_em_runs(celula.paragraphs)

    doc.save(docx_saida)
    log(f"DOCX gerado: {docx_saida}")

# -------------------------------------------------
def converter_para_pdf(docx_path):
    log("Iniciando conversão para PDF")

    result = subprocess.run(
        [
            SOFFICE,
            "--headless",
            f"-env:UserInstallation=file://{PROFILE_DIR}",
            "--convert-to", "pdf",
            docx_path,
            "--outdir", os.path.dirname(docx_path)
        ],
        stdout=subprocess.PIPE,
        stderr=subprocess.PIPE,
        text=True
    )

    log("LibreOffice STDOUT: " + result.stdout)
    log("LibreOffice STDERR: " + result.stderr)

    if result.returncode != 0:
        raise RuntimeError("Erro na conversão para PDF")

    # Apaga o DOCX após conversão
    if os.path.exists(docx_path):
        os.remove(docx_path)
        log(f"DOCX removido após conversão: {docx_path}")

# -------------------------------------------------
# MAIN
# -------------------------------------------------
try:
    log("===== SCRIPT INICIADO =====")

    raw = sys.stdin.read()
    if not raw.strip():
        raise RuntimeError("Dados não recebidos do PHP")

    dados = json.loads(raw)
    log(f"Dados recebidos: {dados}")

    template = os.path.join(BASE_DIR, "template.docx")

    nome_pessoa = normalizar_nome(dados.get("nome"))

    base_nome = f"ficha_{nome_pessoa}"

    docx_saida = os.path.join(PASTA_DIA, base_nome + ".docx")
    pdf_gerado = os.path.join(PASTA_DIA, base_nome + ".pdf")

    substituir_tags(template, docx_saida, dados)
    converter_para_pdf(docx_saida)

    # NÃO redefina pdf_gerado aqui

    if not os.path.exists(pdf_gerado):
        raise RuntimeError("PDF não encontrado após conversão")

    log(f"PDF gerado com sucesso: {pdf_gerado}")
    print(pdf_gerado)

    log("===== SCRIPT FINALIZADO COM SUCESSO =====")

except Exception as e:
    log("ERRO FATAL:")
    log(str(e))
    log(traceback.format_exc())
    print("ERRO:", str(e))
    sys.exit(1)
