import os
from time import time
from functools import wraps
from datetime import date
import requests
from dotenv import load_dotenv

# Carregar variáveis de ambiente do arquivo .env
load_dotenv()

# Definição das credenciais e URL base da API
CLIENT_ID = os.environ.get("CLIENT_ID")
CLIENT_SECRET = os.environ.get("CLIENT_SECRET")
CERT_PATH = os.environ.get("CERT_PATH")
CERT_KEY_PATH = os.environ.get("CERT_KEY_PATH")
ACCOUNT = os.environ.get("ACCOUNT", None)
API_BASE_URL = "https://cdpj.partners.bancointer.com.br"

# Cache para tokens de acesso
token_cache = {}

def token_required(f):
  @wraps(f)
  def decorated(*args, **kwargs):
    data = {
      "domain": "example.com",
      "scopes": ["boleto-cobranca.write", "boleto-cobranca.read"]
    }
    return f(data, *args, **kwargs)
  return decorated

def obter_token(scopes=["boleto-cobranca.write", "boleto-cobranca.read"]):
  """Obtem um token de acesso para a API do Banco Inter."""
  scopes_param = " ".join(scopes)
  if token_cache.get(scopes_param):
    cached_token = token_cache.get(scopes_param)
    # token is still valid
    if cached_token.get("expires_at") > int(time()):
      return cached_token["token"]
  try:
    request_string = f"client_id={CLIENT_ID}&client_secret={CLIENT_SECRET}&scope={scopes_param}&grant_type=client_credentials"
    print("request_string", request_string)
    response = requests.post(url=f"{API_BASE_URL}/oauth/v2/token",
                             headers={"Content-Type": "application/x-www-form-urlencoded"},
                             cert=(CERT_PATH, CERT_KEY_PATH),
                             data=request_string)
    
    # Verificar o status da resposta
    if response.status_code != 200:
        print(f"Erro na requisição: {response.status_code}")
        print("Resposta bruta:", response.text)  # Imprime a resposta bruta para debugar

    data_json = response.json()
    print("Resposta JSON:", data_json)  # Imprimir o JSON da resposta
    token = data_json.get("access_token")
    
    # Cache do token
    token_cache[scopes_param] = {
      "token": token,
      "expires_at": data_json.get("expires_in") + int(time()),
    }
    return token
  except Exception as e:
    print(f"Erro ao obter token de acesso: {e}")
    return None


def get_balance():
    """Obtém o saldo da conta no Banco Inter."""
    token = obter_token(["saldo.read"])
    if not token:
        print("Erro: não foi possível obter o token de acesso.")
        return None

    try:
        response = requests.get(
            f"{API_BASE_URL}/banking/v2/saldo",
            headers={"Authorization": f"Bearer {token}"},
            cert=(CERT_PATH, CERT_KEY_PATH)
        )
        response.raise_for_status()
        return response.json()
    
    except requests.RequestException as e:
        print(f"Erro ao obter saldo: {e}")
        return None


def get_statements(start_date: str, end_date: str):
    """Obtém o extrato da conta no Banco Inter entre as datas informadas."""
    token = obter_token(["extrato.read"])
    if not token:
        print("Erro: não foi possível obter o token de acesso.")
        return None

    try:
        response = requests.get(
            f"{API_BASE_URL}/banking/v2/extrato",
            params={"dataInicio": start_date, "dataFim": end_date},
            headers={"Authorization": f"Bearer {token}"},
            cert=(CERT_PATH, CERT_KEY_PATH)
        )
        response.raise_for_status()
        return response.json()
    
    except requests.RequestException as e:
        print(f"Erro ao obter extrato: {e}")
        return None


if __name__ == "__main__":
    time_now = time()
    yesterday = date.fromtimestamp(time_now - 60 * 60 * 24).strftime("%Y-%m-%d")
    today = date.fromtimestamp(time_now).strftime("%Y-%m-%d")

    print(f"Obtendo informações financeiras para o período: {yesterday} - {today}")

    # Obter saldo
    balance_data = get_balance()
    print("Saldo:", balance_data)

    # Obter extrato
    statements_data = get_statements(yesterday, today)
    print("Extrato:", statements_data)
