import requests
from django.conf import settings


class EMSApiClient:
    """
    Client for the ICTAZ External EMS API.

    Authenticates with JWT and fetches paid registrations.
    Token is cached in-memory for the lifetime of this instance.
    """

    def __init__(self):
        self.base_url = settings.EMS_API_BASE_URL.rstrip('/')
        self.username = settings.EMS_API_USERNAME
        self.password = settings.EMS_API_PASSWORD
        self._token = None

    def _authenticate(self):
        url = f'{self.base_url}/api/auth/signin?authMethod=jwt'
        resp = requests.post(
            url,
            json={'username': self.username, 'password': self.password},
            timeout=30,
        )
        resp.raise_for_status()
        data = resp.json()
        # The API may return the token as 'token', 'accessToken', or 'jwt'
        token = data.get('token') or data.get('accessToken') or data.get('jwt')
        if not token:
            raise ValueError(f'EMS auth response did not contain a token. Response: {data}')
        self._token = token
        return token

    def _get_token(self):
        if not self._token:
            self._authenticate()
        return self._token

    def fetch_paid_registrations(self, event_type: str) -> list[dict]:
        """
        Fetch all paid registrations for the given eventType (e.g. 'AGM', 'CONFERENCE').
        Returns a list of member dicts from the EMS API.
        """
        token = self._get_token()
        url = f'{self.base_url}/api/registrations/paid-report'
        resp = requests.get(
            url,
            params={'eventType': event_type},
            headers={'Authorization': f'Bearer {token}'},
            timeout=60,
        )
        if resp.status_code == 401:
            # Token expired — re-authenticate and retry once
            self._token = None
            token = self._get_token()
            resp = requests.get(
                url,
                params={'eventType': event_type},
                headers={'Authorization': f'Bearer {token}'},
                timeout=60,
            )
        resp.raise_for_status()
        return resp.json()
