import json
from datetime import datetime, timedelta
from pathlib import Path
from config import LOG_FILE, EXPIRATION_HOURS

def load_log():
    if Path(LOG_FILE).exists():
        with open(LOG_FILE, "r") as f:
            try:
                return json.load(f)
            except Exception as e:
                print(f"[ERRO] Falha ao carregar o log JSON: {e}")
                return {}
    return {}

def save_log(log):
    with open(LOG_FILE, "w") as f:
        json.dump(log, f, indent=2)

def was_recently_sent(log, cart_id, message_type):
    cid = str(cart_id)
    if cid in log and message_type in log[cid]:
        try:
            sent_time = datetime.fromisoformat(log[cid][message_type])
            delta = datetime.now() - sent_time
            return delta < timedelta(hours=EXPIRATION_HOURS)
        except Exception as e:
            print(f"[ERRO] Erro ao interpretar data do log: {e}")
            return False
    return False

def update_log(log, cart_id, message_type):
    cid = str(cart_id)
    if cid not in log:
        log[cid] = {}
    log[cid][message_type] = datetime.now().isoformat()
    save_log(log)

def clean_expired_entries(log, forcar_limpeza=False):
    if forcar_limpeza:
        print("[TESTE] Limpando todo o sent_log.json para fins de teste.")
        return {}

    cutoff = datetime.now() - timedelta(hours=EXPIRATION_HOURS)
    cleaned = {}

    print(f"[DEBUG] Cutoff de expiração: {cutoff.isoformat()}")

    for cid, entries in log.items():
        print(f"[DEBUG] Verificando carrinho: {cid}")
        valid = {}

        for mtype, ts in entries.items():
            print(f"[DEBUG] Tipo: {mtype}, Timestamp: {ts}")
            try:
                ts_obj = datetime.fromisoformat(ts)
                if ts_obj > cutoff:
                    valid[mtype] = ts
                else:
                    print(f"[INFO] Expirado - será removido: {cid} / {mtype}")
            except Exception as e:
                print(f"[ERRO] Timestamp inválido ({ts}) para carrinho {cid}: {e}")

        if valid:
            cleaned[cid] = valid

    return cleaned
