#!/usr/bin/env python3
"""
OTrack Sender — Chamado automaticamente pelo MeOS após exportar o XML.

Configuração no MeOS (Services → Results Online → Save to disk):
  - Save to disk: ✅ Ativado
  - Folder: C:\MeosExport  (ou qualquer pasta)
  - Script to run after export: C:\MeosExport\otrack_sender.py

O MeOS passará o caminho do arquivo gerado como primeiro argumento.
Se não passar (algumas versões do MeOS), o script busca automaticamente
o arquivo .xml mais recente na pasta do script.

Instalação (apenas uma vez):
  pip install requests
"""

import sys
import os
import glob
import logging
import requests

# ──────────────────────────────────────────────────────
# CONFIGURAÇÃO — edite estas variáveis
# ──────────────────────────────────────────────────────

# URL da função importXml no OTrack
OTRACK_URL = "https://otrack.base44.app/functions/importXml"

# Token gerado no OTrack (Administração → Resultados ao Vivo)
API_KEY = "SEU_TOKEN_AQUI"

# Pasta onde o MeOS salva os XMLs (usada como fallback se o MeOS
# não passar o caminho do arquivo como argumento)
EXPORT_FOLDER = os.path.dirname(os.path.abspath(__file__))

# ──────────────────────────────────────────────────────

logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s [%(levelname)s] %(message)s",
    datefmt="%H:%M:%S",
    handlers=[
        # Log em arquivo na mesma pasta do script (para depuração)
        logging.FileHandler(os.path.join(os.path.dirname(__file__), "otrack_sender.log"), encoding="utf-8"),
        logging.StreamHandler(sys.stdout),
    ]
)
log = logging.getLogger("otrack")


def find_latest_xml(folder):
    """Encontra o arquivo .xml mais recente na pasta especificada."""
    xml_files = glob.glob(os.path.join(folder, "*.xml"))
    if not xml_files:
        return None
    return max(xml_files, key=os.path.getmtime)


def cleanup_old_xmls(keep_filepath):
    """Deleta todos os .xml da pasta exceto o arquivo mais recente."""
    folder = os.path.dirname(os.path.abspath(keep_filepath))
    xml_files = glob.glob(os.path.join(folder, "*.xml"))
    if len(xml_files) <= 1:
        return
    latest = max(xml_files, key=os.path.getmtime)
    deleted = 0
    for f in xml_files:
        if os.path.abspath(f) != os.path.abspath(latest):
            try:
                os.remove(f)
                deleted += 1
            except Exception as e:
                log.warning(f"Não foi possível apagar {os.path.basename(f)}: {e}")
    if deleted:
        log.info(f"🧹 {deleted} arquivo(s) antigo(s) apagado(s). Mantido: {os.path.basename(latest)}")


def main():
    if API_KEY == "SEU_TOKEN_AQUI":
        log.error("Configure a variável API_KEY com o token gerado no OTrack!")
        sys.exit(1)

    # O MeOS passa o caminho do arquivo como primeiro argumento;
    # se não passar, busca o XML mais recente na pasta de exportação.
    if len(sys.argv) >= 2:
        filepath = sys.argv[1]
    else:
        log.warning("Nenhum arquivo passado como argumento. Buscando XML mais recente...")
        filepath = find_latest_xml(EXPORT_FOLDER)
        if not filepath:
            log.error(f"Nenhum arquivo .xml encontrado em: {EXPORT_FOLDER}")
            sys.exit(1)
        log.info(f"Arquivo encontrado: {filepath}")

    if not os.path.isfile(filepath):
        log.error(f"Arquivo não encontrado: {filepath}")
        sys.exit(1)

    try:
        with open(filepath, "r", encoding="utf-8", errors="replace") as f:
            xml_content = f.read()

        if "ResultList" not in xml_content:
            log.warning(f"Arquivo ignorado (não é um ResultList IOF válido): {filepath}")
            sys.exit(0)

        log.info(f"Enviando: {os.path.basename(filepath)} ({len(xml_content)} bytes)")

        resp = requests.post(
            OTRACK_URL,
            data=xml_content.encode("utf-8"),
            headers={
                "Content-Type": "application/xml; charset=utf-8",
                "X-Api-Key": API_KEY,
            },
            timeout=30,
        )

        if resp.ok:
            data = resp.json()
            log.info(
                f"✅ Enviado com sucesso — "
                f"{data.get('classes', '?')} classes, "
                f"{data.get('competitors', '?')} competidores"
            )
            # Manter apenas o XML mais recente na pasta, deletar os antigos
            cleanup_old_xmls(filepath)
        else:
            log.error(f"❌ Erro {resp.status_code}: {resp.text[:300]}")
            sys.exit(1)

    except requests.ConnectionError:
        log.error("❌ Sem conexão com o OTrack. Verifique a internet.")
        sys.exit(1)
    except Exception as e:
        log.error(f"❌ Erro inesperado: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()
