from config import MODO_TESTE, EMAILS_TESTE, LOG_PATH
from utils.logger import registrar_log
from db.query import get_abandoned_carts
from services.notifier import send_email, send_whatsapp_link
from services.logbook import (
    load_log, save_log,
    was_recently_sent, update_log,
    clean_expired_entries
)
import os
import json
from datetime import datetime

# Função de log em terminal + arquivo
def registrar_log(mensagem):
    timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    linha = f"[{timestamp}] {mensagem}"
    try:
        print(linha)
    except UnicodeEncodeError:
        print(linha.encode("ascii", errors="ignore").decode())

    os.makedirs(os.path.dirname(LOG_PATH), exist_ok=True)
    with open(LOG_PATH, "a", encoding="utf-8") as f:
        f.write(linha + "\n")

# Formata valor no padrão BRL
def format_brl(value):
    try:
        valor = float(value)
        return f"R$ {valor:,.2f}".replace(",", "X").replace(".", ",").replace("X", ".")
    except:
        return "R$ 0,00"

# Função principal
def main():
    registrar_log("Iniciando verificacao de carrinhos abandonados...")

    # Carrega e limpa log
    log = clean_expired_entries(load_log())

    # Executa SQL
    carts = get_abandoned_carts()
    registrar_log(f"Carrinhos encontrados: {len(carts)}")

    for cart in carts:
        email = (cart.get("customer_email") or "").lower()

        # Filtro por MODO TESTE
        if MODO_TESTE and email not in EMAILS_TESTE:
            registrar_log(f"[TESTE] Ignorado: {email}")
            continue

        cart_id = cart["cart_id"]
        phone = cart.get("customer_phone")
        nome = f"{cart.get('customer_firstname', '')} {cart.get('customer_lastname', '')}".strip()

        cart_info = {
            "url": f"{cart['cart_url']}?utm_source=mkt&utm_medium=e-mail&utm_campaign=e-mail-carrinho",
            "produtos": cart["product_skus"],
            "valor": format_brl(cart["total_amount"]),
            "imagem": cart.get("product_image_url") or ""
        }

        # Envio de email
        if email:
            if was_recently_sent(log, cart_id, "email"):
                registrar_log(f"Email ja enviado para o carrinho {cart_id} - ignorando.")
            else:
                send_email(email, nome, cart_info)
                update_log(log, cart_id, "email")
                registrar_log(f"[EMAIL] Enviado para: {email}")

        # Envio de WhatsApp
        if phone:
            if was_recently_sent(log, cart_id, "whatsapp"):
                registrar_log(f"WhatsApp ja enviado para o carrinho {cart_id} - ignorando.")
            else:
                send_whatsapp_link(phone, nome, cart_info)
                update_log(log, cart_id, "whatsapp")
                registrar_log(f"[WHATSAPP] Enviado para: {phone}")

        # Gravação dos dados em um único arquivo JSON
        try:
            os.makedirs("enviados", exist_ok=True)
            data_envio = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            dados_envio = {
                "data": data_envio,
                "cart_id": cart_id,
                "nome": nome,
                "email": email,
                "whatsapp": phone,
                "link_carrinho": cart_info["url"],
                "valor": cart_info["valor"],
                "produtos": cart_info["produtos"],
                "imagem": cart_info["imagem"]
            }

            caminho_arquivo = os.path.join("enviados", "dados.json")
            if os.path.exists(caminho_arquivo):
                with open(caminho_arquivo, "r", encoding="utf-8") as f:
                    registros = json.load(f)
            else:
                registros = []

            registros.append(dados_envio)

            with open(caminho_arquivo, "w", encoding="utf-8") as f:
                json.dump(registros, f, ensure_ascii=False, indent=2)

        except Exception as e:
            registrar_log(f"[ERRO] Falha ao atualizar dados.json: {e}")

    # Salva o log atualizado
    save_log(log)
    registrar_log("Verificacao finalizada.\n")

if __name__ == "__main__":
    main()
