import psycopg2
import requests
import time
from datetime import timedelta
from docx import Document
from docx.shared import Pt, RGBColor
import urllib3

# CONFIGURAÇÕES

urllib3.disable_warnings(urllib3.exceptions.InsecureRequestWarning)

# Token Bearer (cole aqui se já tiver)
TOKEN_TEMPORARIO = "eyJ0eXAiOiJKV1QiLCJhbGciOiJSUzI1NiJ9.eyJhdWQiOiI2IiwianRpIjoiNjJjODE5NWE0OTk2ZDkwNGQxZmI1MDU5NWJmOGNlYzFhYzZlYThiYjk5ZDk1YjUyZTY5OTE1OWE1Mzc5MzNiMTQzMDhiNDFlMGZlOGU4MjIiLCJpYXQiOjE3Njg1ODgyNDUuOTk1MTUsIm5iZiI6MTc2ODU4ODI0NS45OTUxNTIsImV4cCI6MTc2OTg4NDI0NS45OTIzOSwic3ViIjoiNCIsInNjb3BlcyI6W119.EhL2_a0bpH5A-cxXY-FnVQVzaX5fYVZhKX8sTuxKJmAEk6WsM1qW3YperrASvM74Tsk1cNjqg_1bRjDOFn6QMyO8yTw_y-9M33Q6q_0_Ijm-k22oSYdEzc83fIhM3QSLNkwOQfj2PYvPBUf6gGFpDXp1r2LG-egIYfAuovF_npY8f_HujwzridHFJZh1CvU_4H9Kd_eHj0dlmSASwcr0zFBepiQRIOsRa3Ol9jhrN7HzQ9aRATsEqs8H_VaXxZSL36foHONELWAP1XflOEgPc1NRSQYtp_yWoe0EuE-vRh1EJI145d7TO739x-Li6HbtqAWVjtbkyEe4_32RwrLHnQMyDenVwJHJv13nDZn-UVOBoTO4TXyLzSACp23yXn8Ce3L7RVdmFAUujyBN3dfbzLQONpWJ5B1RV-5neEoj14R1ptPXuHZtaEkJ1BFqxWp5Ugt5jveVbCNgrX9pmY45qlcfxry1v4M81WiyLtNdeooIKQJKQOV8U0lk8Q7lihD72Ec5aNZNgY-e9qXr9mEa6c78VrlfJzx8piRzNLCuDgkYA0zE0xfcf1naSa75vbqGfutcanOlO8KwwMeybnhzYF6OhnuoJy0lSbFWaRKYn9Z-cAfGatJpGSrsrNHFBO4TNCSp4j6U3wHXOJ3koqPT_vI_QWYrj-2Slw6nifG66yw"

# Banco de dados
HOST_DB = "191.37.171.239"
DATABASE = "dbsgp"
PORT = 5432
USER_DB = "consulta_sgp"
PASS_DB = "LvUgFpVXyo9ofczw"

# Cliente alvo
ID_CLIENTE_ALVO = 658  # Ex: Venner

# API
API_URL = "https://38.226.184.125:17122/cdr"

# Período
TIME_START = "2025-11-01 00:00:00"
TIME_END = "2025-11-30 23:59:59"

# FUNÇÃO PRINCIPAL

def gerar_docx_venner():

# 1. BUSCA DADOS DO CLIENTE NO BANCO
    conn = psycopg2.connect(
        host=HOST_DB,    
        port=PORT,                
        database=DATABASE,        
        user=USER_DB,      
        password=PASS_DB, 
        sslmode="prefer"      
    )
    cur = conn.cursor()

    sql = f"""
    SELECT 
        upper(p.nome),
        p.cpfcnpj,
        c.id,
        upper(e.logradouro),
        e.numero,
        upper(e.complemento),
        upper(e.bairro),
        upper(e.cidade),
        upper(e.uf),
        (
            SELECT co.contato 
            FROM admcore_contato co
            INNER JOIN admcore_clientecontato cc 
                ON cc.contato_id = co.id
            WHERE cc.cliente_id = c.id 
              AND co.tipo = 'EMAIL'
            LIMIT 1
        ),
        (
            SELECT co.contato 
            FROM admcore_contato co
            INNER JOIN admcore_clientecontato cc 
                ON cc.contato_id = co.id
            WHERE cc.cliente_id = c.id 
              AND co.tipo LIKE 'CELULAR%'
            LIMIT 1
        )
    FROM admcore_cliente c
    INNER JOIN admcore_pessoa p ON c.pessoa_id = p.id
    INNER JOIN admcore_endereco e ON c.endereco_id = e.id
    WHERE c.id = {ID_CLIENTE_ALVO}
    """

    cur.execute(sql)
    res = cur.fetchone()

    if not res:
        print("Cliente não encontrado no banco.")
        return

    nome, cnpj, id_cli = res[0], res[1], res[2]
    end_1 = f"{res[3]} {res[4]} {res[5] if res[5] else ''}".strip()
    end_2 = f"{res[6]}, {res[7]}-{res[8]}"
    email = res[9] or "Não informado"
    telefone = res[10] or "Não informado"

    cur.close()
    conn.close()

    # 2. BUSCA CHAMADAS NA API (CONFORME DOCUMENTAÇÃO)
    chamadas = []

    headers = {
        "Authorization": f"Bearer {TOKEN_TEMPORARIO}",
        "Accept": "application/json"
    }

    params = {
        "time_start": TIME_START,
        "time_end": TIME_END,
        "client_id": id_cli,
        "timestamp": int(time.time())
        # Filtros opcionais:
        # "status": "ANSWERED",
        # "sense_of_call": "S",
        # "id_sip": 5,
    }

    try:
        response = requests.get(
            API_URL,
            headers=headers,
            params=params,
            timeout=30
        )
        response.raise_for_status()
        chamadas = response.json().get("data", [])
    except Exception as e:
        print(f"Aviso: erro ao consultar API ({e}). Documento será gerado sem consumo.")

    # 3. GERAÇÃO DO DOCUMENTO DOCX
    doc = Document()
    azul = RGBColor(0, 112, 192)

    # Cabeçalho
    h = doc.add_heading("Informações do Cliente e Serviço", level=1)
    h.runs[0].font.color.rgb = azul

    p = doc.add_paragraph()
    p.add_run("CLIENTE (FATURAMENTO)\n").bold = True
    p.add_run(f"{nome}\n").bold = True
    p.add_run(f"CNPJ: {cnpj}\n")
    p.add_run(f"ID DO CLIENTE: {id_cli}\n")
    p.add_run(f"ENDEREÇO: {end_1}\n{end_2}\n\n")

    p.add_run(f"Telefone: {telefone}\n").font.size = Pt(10)
    p.add_run(f"E-mail: {email}\n\n").font.size = Pt(10)

    p.add_run("Descrição do Serviço:\n").bold = True
    p.add_run("VOIP – PABX VIRTUAL (ATÉ 10 RAMAIS)\n")

    # 4. RESUMO DE CHAMADAS
    doc.add_heading("Resumo de Chamadas", level=2).runs[0].font.color.rgb = azul

    total_segundos = sum(int(float(c.get("duration", 0))) for c in chamadas)
    chamadas_atendidas = sum(1 for c in chamadas if c.get("status") == "ANSWERED")

    rp = doc.add_paragraph()
    rp.add_run("Mês de Referência: Novembro/2025\n")
    rp.add_run(f"Chamadas Atendidas: {chamadas_atendidas}\n")
    rp.add_run(f"Total de Ligações: {len(chamadas)}\n")
    rp.add_run(f"Minutagem Total: {str(timedelta(seconds=total_segundos))}")

    # 5. TABELA DE DETALHAMENTO
    doc.add_heading("Detalhe do Consumo", level=2).runs[0].font.color.rgb = azul

    tabela = doc.add_table(rows=1, cols=6)
    tabela.style = "Table Grid"

    cabecalho = [
        "Data",
        "Sentido",
        "Origem",
        "Destino",
        "Tempo Total",
        "Status"
    ]

    for i, texto in enumerate(cabecalho):
        tabela.rows[0].cells[i].text = texto

    for c in chamadas:
        row = tabela.add_row().cells
        row[0].text = c.get("time_start", "").replace("T", " ")[:16]
        row[1].text = "SAÍDA" if c.get("sense_of_call") == "S" else "ENTRADA"
        row[2].text = str(c.get("source_number", "-"))
        row[3].text = str(c.get("destination_number", "-"))
        row[4].text = str(
            timedelta(seconds=int(float(c.get("duration", 0))))
        )
        row[5].text = (
            "ATENDIDA" if c.get("status") == "ANSWERED" else "NÃO ATENDIDA"
        )

    # 6. SALVAR ARQUIVO
    nome_arquivo = f"RELATORIO_CLIENTE_{id_cli}_NOV_2025.docx"
    doc.save(nome_arquivo)

    print(f"Arquivo gerado com sucesso: {nome_arquivo}")


# EXECUÇÃO
if __name__ == "__main__":
    gerar_docx_venner()
