#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import sys
import mysql.connector
from datetime import datetime
import smtplib
from email.mime.text import MIMEText
from email.mime.multipart import MIMEMultipart

# ─────────────────────────────────────────────
# CONFIGURAÇÕES DE EMAIL
# ─────────────────────────────────────────────
SMTP_CONFIG = {
    'host': 'smtp.gmail.com',
    'port': 587,
    'user': 'ticocodovale@gmail.com',
    'password': 'yzco wtbs plfu abhh',
    'use_tls': True
}

# ─────────────────────────────────────────────
# MAPEAMENTO SETOR -> EMAIL
# ─────────────────────────────────────────────
EMAILS_SETORES = {
    'almoxarifado': 'joseildof1@gmail.com',
    'expedicao':    'expedicao@cocodovale.com.br',
    'industria':    'industria@cocodovale.com.br',
    'agricola':     'agricola@cocodovale.com.br',
    'qualidade':    'qualidade@cocodovale.com.br',
}

# ─────────────────────────────────────────────
# CONFIGURACAO DO BANCO
# ─────────────────────────────────────────────
DB_CONFIG = {
    'host':     'localhost',
    'user':     'ti',
    'password': '@vale.123',
    'database': 'balanca',
    'charset':  'utf8mb4'
}

# ─────────────────────────────────────────────
# ACOES CONTEXTUAIS POR PALAVRA-CHAVE NO MOTIVO
# ─────────────────────────────────────────────
ACOES_CONTEXTUAIS = [
    (
        ['valor', 'preco', 'preco', 'unitario', 'divergente', 'diferente'],
        '💰',
        'Verifique os <strong>valores unitários</strong> da nota fiscal e compare com o pedido de compra. '
        'Solicite ao fornecedor a emissão de nota corrigida ou carta de correção.'
    ),
    (
        ['quantidade', 'qtd', 'qtde', 'volume', 'excede', 'menor', 'maior'],
        '📦',
        'Confira as <strong>quantidades</strong> da nota fiscal versus o pedido aprovado. '
        'Alinhe com o fornecedor o ajuste antes da nova tentativa de entrega.'
    ),
    (
        ['nota', 'fiscal', 'nf', 'nfe', 'danfe', 'ilegivel', 'incorreta', 'invalida'],
        '📄',
        'A <strong>nota fiscal</strong> apresenta inconsistência. Solicite ao fornecedor a emissão de '
        'nota corrigida ou carta de correção eletrônica (CC-e) antes de retornar.'
    ),
    (
        ['pedido', 'po', 'ordem', 'compra', 'nao aprovado', 'sem pedido', 'autorizado'],
        '📋',
        None  # texto gerado dinamicamente com nome do setor
    ),
    (
        ['fornecedor', 'empresa', 'cnpj', 'nao corresponde', 'diverge'],
        '🏢',
        'O <strong>fornecedor</strong> da nota fiscal não corresponde ao cadastrado no pedido. '
        'Verifique se houve erro de emissão ou se o pedido precisa ser atualizado.'
    ),
]


def normalizar_texto(texto):
    """Remove acentos e converte para minusculas"""
    if not texto:
        return ''
    mapa = {
        'a':'a','a':'a','a':'a','a':'a','e':'e','e':'e',
        'i':'i','o':'o','o':'o','o':'o','u':'u','u':'u','c':'c',
        '\xe1':'a','\xe0':'a','\xe3':'a','\xe2':'a',
        '\xe9':'e','\xea':'e','\xed':'i',
        '\xf3':'o','\xf4':'o','\xf5':'o',
        '\xfa':'u','\xfc':'u','\xe7':'c'
    }
    resultado = texto.lower().strip()
    for ac, sem in mapa.items():
        resultado = resultado.replace(ac, sem)
    return resultado


def obter_email_setor(setor):
    setor_norm = normalizar_texto(setor)
    for chave, email in EMAILS_SETORES.items():
        if normalizar_texto(chave) == setor_norm:
            return email
    for chave, email in EMAILS_SETORES.items():
        if normalizar_texto(chave) in setor_norm or setor_norm in normalizar_texto(chave):
            return email
    return None


def detectar_acoes(motivo, setor='Setor Responsável'):
    """Retorna lista de acoes contextuais baseadas no motivo"""
    if not motivo:
        return []
    motivo_norm = normalizar_texto(motivo)
    setor_upper = (setor or 'Setor Responsável').upper()
    acoes = []
    for palavras, icone, texto in ACOES_CONTEXTUAIS:
        if any(p in motivo_norm for p in palavras):
            if texto is None:
                # Ação de pedido — usa nome real do setor
                texto = (
                    'O <strong>pedido de compra</strong> não está aprovado no sistema. '
                    'O setor <strong>' + setor_upper + '</strong> deve regularizar a aprovação '
                    'antes de autorizar o recebimento desta entrega.'
                )
            acoes.append((icone, texto))
    if not acoes:
        acoes.append(('📞', 'Entre em contato com o fornecedor e solicite a correção das '
                      'inconsistências apontadas. Após regularização, o setor de Compras '
                      'liberará a entrega no sistema YMS.'))
    return acoes


def buscar_dados_veiculo(veiculo_id):
    try:
        con = mysql.connector.connect(**DB_CONFIG)
        cur = con.cursor(dictionary=True)
        cur.execute("""
            SELECT
                v.id, v.placa, v.condutor, v.fornecedor,
                v.setorautoriza, v.finalidade, v.status,
                v.compras_checklist,
                h.observacao  AS motivo_reprovacao,
                h.usuario     AS reprovado_por,
                h.data_hora   AS data_reprovacao
            FROM entrada_veiculo v
            LEFT JOIN historico_status h
                   ON h.veiculo_id = v.id
                  AND h.status_novo = 'Reprovado Compras'
            WHERE v.id = %s
            ORDER BY h.data_hora DESC
            LIMIT 1
        """, (veiculo_id,))
        resultado = cur.fetchone()
        cur.close()
        con.close()
        return resultado
    except mysql.connector.Error as e:
        print(f"Erro BD: {e}")
        return None


def formatar_data(dt):
    if not dt:
        return 'N/A'
    if isinstance(dt, str):
        return dt
    return dt.strftime('%d/%m/%Y \xe0s %H:%M')


def gerar_html_email(dados):
    """Gera o HTML compacto e bonito do email"""

    # Limpa o motivo
    motivo = dados.get('motivo_reprovacao') or 'Nao informado'
    for prefixo in ['ENTREGA REPROVADA - Motivo:', 'ENTREGA REPROVADA -', 'Motivo:']:
        if motivo.startswith(prefixo):
            motivo = motivo[len(prefixo):].strip()

    setor      = dados.get('setorautoriza') or ''
    setor_disp = setor.upper() if setor else 'N/A'

    # Detecta ações contextuais passando o setor real
    acoes = detectar_acoes(motivo, setor)

    # Monta blocos de ação HTML
    blocos_acao = ''
    for icone, texto in acoes:
        blocos_acao += (
            '<tr>'
            '<td style="padding:11px 14px;border-bottom:1px solid #dcfce7;'
            'vertical-align:top;font-size:18px;width:36px;">' + icone + '</td>'
            '<td style="padding:11px 14px;border-bottom:1px solid #dcfce7;'
            'font-size:13px;color:#166534;line-height:1.55;">' + texto + '</td>'
            '</tr>'
        )

    # ── Bloco "Quem deve agir" baseado no checklist salvo ──────────────────
    checklist = dados.get('compras_checklist') or ''
    responsaveis_html = ''
    if checklist:
        issues_forn = []
        if 'Valores OK'      not in checklist: issues_forn.append('Valores unitários')
        if 'Quantidades OK'  not in checklist: issues_forn.append('Quantidades')
        if 'Nota Fiscal OK'  not in checklist: issues_forn.append('Nota Fiscal')
        if 'Fornecedor OK'   not in checklist: issues_forn.append('Fornecedor')
        issue_pedido = 'Pedido Aprovado' not in checklist

        blocos_resp = ''
        if issue_pedido and setor:
            blocos_resp += (
                '<tr><td style="padding:10px 14px;border-bottom:1px solid #bfdbfe;'
                'vertical-align:top;font-size:17px;width:36px;">🏢</td>'
                '<td style="padding:10px 14px;border-bottom:1px solid #bfdbfe;'
                'font-size:13px;color:#1e3a8a;line-height:1.5;">'
                '<strong>' + setor.upper() + '</strong>: aprovar o pedido de compra no sistema '
                'para liberar o recebimento desta entrega.</td></tr>'
            )
        if issues_forn:
            lista = ', '.join(issues_forn)
            blocos_resp += (
                '<tr><td style="padding:10px 14px;border-bottom:1px solid #fde68a;'
                'vertical-align:top;font-size:17px;width:36px;">🚚</td>'
                '<td style="padding:10px 14px;border-bottom:1px solid #fde68a;'
                'font-size:13px;color:#78350f;line-height:1.5;">'
                '<strong>FORNECEDOR</strong>: corrigir ' + lista + ' antes da próxima tentativa de entrega.</td></tr>'
            )
        if blocos_resp:
            responsaveis_html = (
                '<div style="font-size:10px;font-weight:700;color:#9ca3af;'
                'text-transform:uppercase;letter-spacing:0.9px;margin-bottom:10px;">'
                'Quem deve agir</div>'
                '<table width="100%" cellpadding="0" cellspacing="0"'
                ' style="border:1px solid #e5e7eb;border-radius:8px;overflow:hidden;margin-bottom:20px;">'
                + blocos_resp +
                '</table>'
            )

    placa      = dados.get('placa')         or 'N/A'
    condutor   = dados.get('condutor')      or 'N/A'
    fornecedor = dados.get('fornecedor')    or 'N/A'
    finalidade = dados.get('finalidade')    or 'N/A'
    reprovado  = dados.get('reprovado_por') or 'N/A'
    data_repr  = formatar_data(dados.get('data_reprovacao'))

    def linha_tabela(icone, label, valor, destaque=False, zebra=False):
        bg = '#f9fafb' if zebra else '#ffffff'
        peso = 'font-weight:700;' if destaque else ''
        return (
            '<tr>'
            '<td style="padding:9px 14px;background:' + bg + ';color:#6b7280;'
            'font-weight:600;font-size:13px;width:44%;border-bottom:1px solid #e5e7eb;">'
            + icone + '&nbsp;' + label + '</td>'
            '<td style="padding:9px 14px;background:' + bg + ';color:#111827;'
            'font-size:13px;' + peso + 'border-bottom:1px solid #e5e7eb;">'
            + valor + '</td>'
            '</tr>'
        )

    linhas_tabela = (
        linha_tabela('🚚', 'Placa', placa, destaque=True, zebra=True) +
        linha_tabela('👤', 'Condutor', condutor, zebra=False) +
        linha_tabela('🏢', 'Fornecedor', fornecedor, destaque=True, zebra=True) +
        linha_tabela('📦', 'Finalidade', finalidade, zebra=False) +
        linha_tabela('🏭', 'Setor responsavel', setor_disp, zebra=True) +
        linha_tabela('⏱', 'Reprovado em', data_repr, zebra=False) +
        linha_tabela('👨‍💼', 'Reprovado por', reprovado, zebra=True)
    )

    html = """\
<!DOCTYPE html>
<html lang="pt-BR">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>Entrega Reprovada</title>
</head>
<body style="margin:0;padding:0;background:#f3f4f6;
             font-family:'Segoe UI',Arial,sans-serif;">

<table width="100%" cellpadding="0" cellspacing="0"
       style="background:#f3f4f6;padding:28px 12px;">
<tr><td align="center">

  <table width="580" cellpadding="0" cellspacing="0"
         style="max-width:580px;width:100%;border-radius:12px;
                overflow:hidden;box-shadow:0 4px 18px rgba(0,0,0,0.11);">

    <!-- CABECALHO -->
    <tr>
      <td style="background:linear-gradient(135deg,#dc2626,#991b1b);
                 padding:26px 32px;text-align:center;">
        <div style="font-size:34px;line-height:1;margin-bottom:8px;">🚫</div>
        <div style="color:#fff;font-size:18px;font-weight:700;letter-spacing:0.3px;">
          Entrega Reprovada &mdash; Compras
        </div>
        <div style="color:rgba(255,255,255,0.70);font-size:12px;margin-top:5px;">
          Sistema YMS &middot; Controle de P&aacute;tio &middot; Coco do Vale
        </div>
      </td>
    </tr>

    <!-- FAIXA DE ALERTA -->
    <tr>
      <td style="background:#fef9c3;border-left:4px solid #eab308;
                 padding:11px 24px;font-size:13px;color:#713f12;">
        <strong>&#9888; A&ccedil;&atilde;o necess&aacute;ria:</strong>
        Corrija as inconsist&ecirc;ncias abaixo e acione o setor de Compras
        para liberar a entrega.
      </td>
    </tr>

    <!-- CORPO -->
    <tr>
      <td style="background:#ffffff;padding:26px 32px;">

        <!-- Dados -->
        <div style="font-size:10px;font-weight:700;color:#9ca3af;
                    text-transform:uppercase;letter-spacing:0.9px;
                    margin-bottom:10px;">Dados da Entrega</div>

        <table width="100%" cellpadding="0" cellspacing="0"
               style="border:1px solid #e5e7eb;border-radius:8px;
                      overflow:hidden;margin-bottom:20px;">
          """ + linhas_tabela + """
        </table>

        <!-- Motivo -->
        <div style="font-size:10px;font-weight:700;color:#9ca3af;
                    text-transform:uppercase;letter-spacing:0.9px;
                    margin-bottom:10px;">Motivo da Reprova&ccedil;&atilde;o</div>

        <div style="background:#fef2f2;border:1px solid #fecaca;
                    border-left:4px solid #dc2626;border-radius:6px;
                    padding:13px 16px;font-size:13px;color:#7f1d1d;
                    line-height:1.6;margin-bottom:20px;">
          """ + motivo + """
        </div>

        <!-- Quem deve agir -->
        """ + responsaveis_html + """

        <!-- Acoes contextuais -->
        <div style="font-size:10px;font-weight:700;color:#9ca3af;
                    text-transform:uppercase;letter-spacing:0.9px;
                    margin-bottom:10px;">O que fazer agora</div>

        <table width="100%" cellpadding="0" cellspacing="0"
               style="background:#f0fdf4;border:1px solid #bbf7d0;
                      border-radius:8px;overflow:hidden;">
          """ + blocos_acao + """
        </table>

      </td>
    </tr>

    <!-- RODAPE -->
    <tr>
      <td style="background:#1f2937;padding:16px 32px;text-align:center;">
        <div style="color:#9ca3af;font-size:12px;line-height:1.7;">
          Mensagem autom&aacute;tica do
          <strong style="color:#d1d5db;">Sistema YMS</strong><br>
          Companhia Aliment&iacute;cia do Vale &middot; Coco do Vale
          &middot; N&atilde;o responda este e-mail
        </div>
      </td>
    </tr>

  </table>

</td></tr>
</table>

</body>
</html>"""

    return html


def enviar_email(destinatario, assunto, corpo_html):
    try:
        msg = MIMEMultipart('alternative')
        msg['From']    = SMTP_CONFIG['user']
        msg['To']      = destinatario
        msg['Subject'] = assunto
        msg.attach(MIMEText(corpo_html, 'html', 'utf-8'))

        if SMTP_CONFIG['use_tls']:
            srv = smtplib.SMTP(SMTP_CONFIG['host'], SMTP_CONFIG['port'])
            srv.starttls()
        else:
            srv = smtplib.SMTP_SSL(SMTP_CONFIG['host'], SMTP_CONFIG['port'])

        srv.login(SMTP_CONFIG['user'], SMTP_CONFIG['password'])
        srv.send_message(msg)
        srv.quit()
        return True
    except Exception as e:
        print(f"Erro SMTP: {e}")
        return False


def main():
    if len(sys.argv) < 2:
        print("Uso: python3 notificar_reprovacao.py <id_veiculo>")
        sys.exit(1)

    veiculo_id = sys.argv[1]
    print(f"Buscando veiculo ID {veiculo_id}...")

    dados = buscar_dados_veiculo(veiculo_id)
    if not dados:
        print(f"Veiculo ID {veiculo_id} nao encontrado.")
        sys.exit(1)

    if dados['status'] != 'Reprovado Compras':
        print(f"Status atual: {dados['status']} - sem necessidade de notificacao.")
        sys.exit(0)

    setor      = dados['setorautoriza']
    email_dest = obter_email_setor(setor)

    if not email_dest:
        print(f"Setor '{setor}' sem email cadastrado.")
        print(f"Setores disponiveis: {', '.join(EMAILS_SETORES.keys())}")
        sys.exit(1)

    print(f"Destino: {email_dest} (setor: {setor})")

    corpo  = gerar_html_email(dados)
    assunto = (
        f"Entrega reprovada - {dados.get('fornecedor','?')} "
        f"- Placa {dados.get('placa','?')}"
    )

    print("Enviando...")
    if enviar_email(email_dest, assunto, corpo):
        print(f"Email enviado para {email_dest}!")

        # Registra envio (ignora se tabela nao existir)
        try:
            con = mysql.connector.connect(**DB_CONFIG)
            cur = con.cursor()
            cur.execute("""
                INSERT INTO notificacoes_enviadas
                    (veiculo_id, tipo, destinatario, assunto, data_envio)
                VALUES (%s, %s, %s, %s, NOW())
            """, (veiculo_id, 'reprovacao_compras', email_dest, assunto))
            con.commit()
            cur.close()
            con.close()
        except mysql.connector.Error:
            pass

        sys.exit(0)
    else:
        print("Falha no envio.")
        sys.exit(1)


if __name__ == "__main__":
    main()