import requests
import pytz
from dotenv import load_dotenv
from datetime import datetime, timedelta
import logging
from .auth import token_required  # Importa a função de autenticação
from flask import request, jsonify

load_dotenv()

base_url = "https://zammad.itguys.com.br/api/v1"
zammad_token = "NDBGddnn7ntkHBZFGlo8mncxgBoLR6fkiLo1bF-GU4egE_n3fUU0-Dm2vW4iepJ_"  # Token expira em 2065

# Mapeamento de domínio para organization_id
DOMINIO_ORG_ID = {
    "esghl.local": [3],
    "oestepan.com.br": [7],
    "ivvcg.com.br": [6],
    "itguys.com.br": list(range(1,15)),
    "integramedbr.com.br": [9],
    "frc.com.br": [4],
    "grupopralog.com.br": [10],
    "zstation.com.br": [11],
    "ibap.org.br": [14]
}

@token_required
def listar_tickets(data):
    """Lista os tickets filtrados pelo domínio do usuário autenticado."""
    
    domain = data.get("domain")
    print(domain)
    if not domain:
        return {"error": "Domínio do usuário não encontrado no token"}, 403

    organization_ids = DOMINIO_ORG_ID.get(domain)
    if not organization_ids:
        return {"error": "Domínio do usuário não possui organização associada"}, 403

    tickets_filtrados = []
    page = 1
    per_page = 100
    data_fim = datetime.now(pytz.timezone('America/Sao_Paulo'))  # Horário atual com fuso horário de São Paulo
    data_inicio = data_fim - timedelta(days=30)

    logging.debug(f"Buscando tickets de {data_inicio} até {data_fim} para organizações {organization_ids}")

    brasil_tz = pytz.timezone('America/Sao_Paulo')

    while True:
        url = f"{base_url}/tickets?page={page}&per_page={per_page}&expand=true"
        headers = {
            "Authorization": f"Token token={zammad_token}",
            "Content-Type": "application/json"
        }

        response = requests.get(url, headers=headers, timeout=10)
        
        # Adicionando log para inspecionar a resposta
        logging.debug(f"Resposta da API para página {page}: {response.status_code}, Conteúdo: {response.text[:100]}...")  # Log apenas os primeiros 100 caracteres para evitar longos logs

        if response.status_code == 200:
            try:
                tickets = response.json()  # Tenta acessar o JSON da resposta
            except ValueError as e:
                logging.error(f"Erro ao converter resposta para JSON: {e}")
                return {"error": "Erro ao converter resposta para JSON"}, 500

            if not tickets:
                logging.debug(f"Página {page} vazia, encerrando busca.")
                break

            for ticket in tickets:
                created_at_str = ticket.get("created_at")
                if created_at_str:
                    try:
                        created_at_dt = datetime.strptime(created_at_str, '%Y-%m-%dT%H:%M:%S.%fZ')
                    except ValueError:
                        created_at_dt = datetime.strptime(created_at_str, '%Y-%m-%dT%H:%M:%SZ')
                    
                    created_at_utc = pytz.utc.localize(created_at_dt)  # Localiza como UTC
                    created_at_brasil = created_at_utc.astimezone(brasil_tz)  # Converte para o horário de Brasília

                    # Filtra pelo intervalo de tempo e pela organização
                    if data_inicio <= created_at_brasil <= data_fim and ticket.get("organization_id") in organization_ids:
                        tickets_filtrados.append({
                            "title": ticket.get("title"),
                            "type": ticket.get("type"),
                            "created_by": ticket.get("created_by"),
                            "created_id": ticket.get("created_id"),
                            "created_at": created_at_brasil.strftime('%Y-%m-%d %H:%M:%S'),  # Formata para string no horário de Brasília
                            "close_at": ticket.get("close_at"),
                            "priority": ticket.get("priority"),
                            "state": ticket.get("state"),
                            "state_id": ticket.get("state_id"),
                            "pending_time": ticket.get("pending_time"),
                            "number": ticket.get("number"),
                            "organization_id": ticket.get("organization_id"),
                            "customer_id": ticket.get("customer_id"),
                            "customer": ticket.get("customer"),
                        })

            logging.debug(f"Página {page} processada, {len(tickets)} tickets retornados.")
            page += 1
        
        else:
            logging.error(f"Erro ao buscar tickets na página {page}: {response.status_code}")
            return {"error": f"Erro ao buscar tickets: {response.status_code}", "details": response.text}, response.status_code

    logging.debug(f"Total de tickets filtrados nos últimos 30 dias: {len(tickets_filtrados)}")

    if tickets_filtrados:
        return tickets_filtrados, 200  # Retorna os tickets como uma lista
    else:
        return {"message": "Nenhum ticket encontrado nos últimos 30 dias."}, 405  # Mensagem de ausência de tickets


