import requests
from datetime import datetime

class APIClient:
    """
    Универсальный клиент для работы с API PMS.
    """
    def __init__(self, base_url, access_token=None, username=None, password=None):
        """
        Инициализация API клиента.

        :param base_url: Базовый URL API
        :param access_token: Токен доступа (если требуется)
        :param username: Имя пользователя (если используется basic auth)
        :param password: Пароль (если используется basic auth)
        """
        self.base_url = base_url
        self.access_token = access_token
        self.auth = (username, password) if username and password else None

    def _build_headers(self):
        """
        Создает заголовки для запроса.
        :return: Словарь заголовков.
        """
        headers = {'Content-Type': 'application/json'}
        if self.access_token:
            headers['Authorization'] = f'Bearer {self.access_token}'
        return headers

    def _make_request(self, method, endpoint, params=None, data=None):
        """
        Выполняет запрос к API.

        :param method: HTTP метод ('GET', 'POST', и т.д.)
        :param endpoint: Конечная точка API.
        :param params: Параметры строки запроса (для GET).
        :param data: Данные для тела запроса (для POST).
        :return: Ответ API в формате JSON.
        """
        url = f"{self.base_url}{endpoint}"
        headers = self._build_headers()
        try:
            response = requests.request(
                method=method,
                url=url,
                headers=headers,
                params=params,
                json=data,
                auth=self.auth
            )
            response.raise_for_status()  # Генерирует исключение для HTTP ошибок
            return response.json()
        except requests.exceptions.RequestException as e:
            print(f"Ошибка при запросе {method} {url}: {e}")
            return None

    def get(self, endpoint, params=None):
        """
        Выполняет GET запрос.
        :param endpoint: Конечная точка API.
        :param params: Параметры строки запроса.
        :return: Ответ API в формате JSON.
        """
        return self._make_request('GET', endpoint, params=params)

    def post(self, endpoint, data=None):
        """
        Выполняет POST запрос.
        :param endpoint: Конечная точка API.
        :param data: Данные для тела запроса.
        :return: Ответ API в формате JSON.
        """
        return self._make_request('POST', endpoint, data=data)

    def fetch_reservations(self, endpoint, from_date, to_date, pagination_start=0, pagination_count=50):
        """
        Получение данных о бронированиях.

        :param endpoint: Конечная точка API для бронирований.
        :param from_date: Дата начала в формате 'YYYY-MM-DDTHH:MM:SS'.
        :param to_date: Дата окончания в формате 'YYYY-MM-DDTHH:MM:SS'.
        :param pagination_start: Начальная точка пагинации.
        :param pagination_count: Количество записей для выборки.
        :return: Ответ API в формате JSON.
        """
        data = {
            "from": from_date,
            "until": to_date,
            "pagination": {"from": pagination_start, "count": pagination_count}
        }
        return self.post(endpoint, data=data)
