#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
Script para coletar dados de cotação a cada hora e salvar em JSON
Executa o cotacao.php e salva a resposta com timestamp
"""

import json
import requests
import os
import sys
from datetime import datetime
import logging

# Configuração do logging
logging.basicConfig(
    level=logging.INFO,
    format="%(asctime)s - %(levelname)s - %(message)s",
    handlers=[
        logging.FileHandler("/var/www/html/cotacao/public_html/cotacao_collector.log"),
        logging.StreamHandler(sys.stdout)
    ]
)

def get_cotacao_data():
    """
    Executa o cotacao.php e retorna os dados JSON
    """
    try:
        # URL do cotacao.php (pode ser local ou remoto)
        url = "https://cotacao.ticketss.app/cotacao.php"
        
        # Headers para simular uma requisição real
        headers = {
            "User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/139.0.0.0 Safari/537.36",
            "Accept": "application/json, text/plain, */*",
            "Accept-Language": "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7",
            "Cache-Control": "no-cache",
            "Pragma": "no-cache"
        }
        
        # Fazer a requisição
        response = requests.get(url, headers=headers, timeout=30)
        response.raise_for_status()
        
        # Verificar se a resposta é JSON válido
        try:
            data = response.json()
            return data
        except json.JSONDecodeError as e:
            logging.error(f"Erro ao decodificar JSON: {e}")
            return None
            
    except requests.exceptions.RequestException as e:
        logging.error(f"Erro na requisição: {e}")
        return None
    except Exception as e:
        logging.error(f"Erro inesperado: {e}")
        return None

def save_cotacao_data(data, timestamp):
    """
    Salva os dados de cotação em um arquivo JSON com timestamp
    """
    try:
        # Criar estrutura com timestamp e dados
        cotacao_entry = {
            "timestamp": timestamp,
            "datetime": datetime.fromtimestamp(timestamp).isoformat(),
            "data": data
        }
        
        # Nome do arquivo fixo
        filename = "/var/www/html/cotacao/public_html/cotacoes.json"
        
        # Carregar dados existentes ou criar nova estrutura
        if os.path.exists(filename):
            try:
                with open(filename, "r", encoding="utf-8") as f:
                    existing_data = json.load(f)
            except (json.JSONDecodeError, FileNotFoundError):
                existing_data = {"entries": []}
        else:
            existing_data = {"entries": []}
        
        # Adicionar nova entrada
        existing_data["entries"].append(cotacao_entry)
        
        # Manter apenas os últimos 7 registros
        if len(existing_data["entries"]) > 7:
            existing_data["entries"] = existing_data["entries"][-7:]
        
        # Salvar arquivo
        with open(filename, "w", encoding="utf-8") as f:
            json.dump(existing_data, f, ensure_ascii=False, indent=2)
        
        logging.info(f"Dados salvos em: {filename}")
        return True
        
    except Exception as e:
        logging.error(f"Erro ao salvar dados: {e}")
        return False

def main():
    """
    Função principal que executa a coleta de dados
    """
    logging.info("Iniciando coleta de dados de cotação...")
    
    # Obter timestamp atual
    timestamp = datetime.now().timestamp()
    
    # Obter dados de cotação
    cotacao_data = get_cotacao_data()
    
    if cotacao_data is not None:
        # Salvar dados
        if save_cotacao_data(cotacao_data, timestamp):
            logging.info("Coleta de dados concluída com sucesso!")
            
            # Estatísticas básicas
            if isinstance(cotacao_data, list):
                logging.info(f"Total de itens coletados: {len(cotacao_data)}")
        else:
            logging.error("Falha ao salvar dados!")
            sys.exit(1)
    else:
        logging.error("Falha ao obter dados de cotação!")
        sys.exit(1)

if __name__ == "__main__":
    main()
