# import requests
# import hashlib
# import json
# from .base_plugin import BasePMSPlugin
# from datetime import datetime, timedelta
# from asgiref.sync import sync_to_async


# class RealtyCalendarPlugin(BasePMSPlugin):
#     """Плагин для импорта данных из системы RealtyCalendar
#     """
#     def __init__(self, config):
#         super().__init__(config)
#         self.public_key = config.public_key
#         self.private_key = config.private_key
#         self.api_url = config.url.rstrip("/")  # Убираем лишний `/` в конце URL

#         if not self.public_key or not self.private_key:
#             raise ValueError("Публичный или приватный ключ отсутствует для RealtyCalendar")
#     def get_default_parser_settings(self):
#         """
#         Возвращает настройки по умолчанию для обработки данных.
#         """
#         return {
#             "date_format": "%Y-%m-%dT%H:%M:%S",
#             "timezone": "UTC"
#         }
#     def _get_sorted_keys(self, obj):
#         """
#         Возвращает отсортированный по имени список ключей.
#         """
#         return sorted(list(obj.keys()))

#     def _generate_data_string(self, obj):
#         """
#         Формирует строку параметров для подписи.
#         """
#         sorted_keys = self._get_sorted_keys(obj)
#         string = "".join(f"{key}={obj[key]}" for key in sorted_keys)
#         return string + self.private_key

#     def _generate_md5(self, string):
#         """
#         Генерирует MD5-хеш от строки.
#         """
#         return hashlib.md5(string.encode("utf-8")).hexdigest()

#     def _generate_sign(self, data):
#         """
#         Генерирует подпись для данных запроса.
#         """
#         data_string = self._generate_data_string(data)
#         return self._generate_md5(data_string)

#     def fetch_data(self):
#         """
#         Выполняет запрос к API RealtyCalendar для получения данных о бронированиях.
#         """
#         base_url = f"https://realtycalendar.ru/api/v1/bookings/{self.public_key}/"
#         headers = {
#             "Accept": "application/json",
#             "Content-Type": "application/json",
#         }

#         # Определяем даты выборки
#         now = datetime.now()
#         data = {
#             "begin_date": (now - timedelta(days=7)).strftime("%Y-%m-%d"),
#             "end_date": now.strftime("%Y-%m-%d"),
#         }

#         # Генерация подписи
#         data["sign"] = self._generate_sign(data)

#         # Отправляем запрос
#         print(f"URL запроса: {base_url}")
#         print(f"Заголовки: {headers}")
#         print(f"Данные запроса: {data}")

#         response = requests.post(url=base_url, headers=headers, json=data)

#         # Логируем результат
#         print(f"Статус ответа: {response.status_code}")
#         print(f"Ответ: {response.text}")

#         # Проверяем успешность запроса
#         if response.status_code == 200:
#             return response.json().get("bookings", [])
#         else:
#             raise ValueError(f"Ошибка API RealtyCalendar: {response.status_code}, {response.text}")

#     async def _save_to_db(self, data, hotel_id):
#         """
#         Сохраняет данные о бронированиях в базу данных.
#         """
#         from hotels.models import Reservation, Hotel

#         hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id)
#         for item in data:
#             try:
#                 reservation, created = await sync_to_async(Reservation.objects.update_or_create)(
#                     reservation_id=item["id"],
#                     hotel=hotel,
#                     defaults={
#                         "room_number": item.get("apartment_id", ""),  # ID квартиры
#                         "check_in": datetime.strptime(item["begin_date"], "%Y-%m-%d"),  # Дата заезда
#                         "check_out": datetime.strptime(item["end_date"], "%Y-%m-%d"),  # Дата выезда
#                         "status": item.get("status", ""),  # Статус бронирования
#                         "price": item.get("amount", 0),  # Сумма оплаты
#                         "client_name": item["client"].get("fio", ""),  # Имя клиента
#                         "client_email": item["client"].get("email", ""),  # Email клиента
#                         "client_phone": item["client"].get("phone", ""),  # Телефон клиента
#                     }
#                 )
#                 print(f"{'Создана' if created else 'Обновлена'} запись: {reservation}")
#             except Exception as e:
#                 print(f"Ошибка при сохранении бронирования ID {item['id']}: {e}")


import requests
import hashlib
import json
from .base_plugin import BasePMSPlugin
from datetime import datetime, timedelta
from asgiref.sync import sync_to_async


class RealtyCalendarPlugin(BasePMSPlugin):
    """Плагин для импорта данных из системы RealtyCalendar
    """
    def __init__(self, config):
        super().__init__(config)
        self.public_key = config.public_key
        self.private_key = config.private_key
        self.api_url = config.url.rstrip("/")

        if not self.public_key or not self.private_key:
            raise ValueError("Публичный или приватный ключ отсутствует для RealtyCalendar")

    def get_default_parser_settings(self):
        """
        Возвращает настройки по умолчанию для обработки данных.
        """
        return {
            "date_format": "%Y-%m-%dT%H:%M:%S",
            "timezone": "UTC"
        }

    def _get_sorted_keys(self, obj):
        """
        Возвращает отсортированный по имени список ключей.
        """
        sorted_keys = sorted(list(obj.keys()))
        print(f"[DEBUG] Отсортированные ключи: {sorted_keys}")
        return sorted_keys

    def _generate_data_string(self, obj):
        """
        Формирует строку параметров для подписи.
        """
        sorted_keys = self._get_sorted_keys(obj)
        string = "".join(f"{key}={obj[key]}" for key in sorted_keys)
        print(f"[DEBUG] Сформированная строка данных: {string}")
        return string + self.private_key

    def _generate_md5(self, string):
        """
        Генерирует MD5-хеш от строки.
        """
        md5_hash = hashlib.md5(string.encode("utf-8")).hexdigest()
        print(f"[DEBUG] Сформированный MD5-хеш: {md5_hash}")
        return md5_hash

    def _generate_sign(self, data):
        """
        Генерирует подпись для данных запроса.
        """
        data_string = self._generate_data_string(data)
        print(f"[DEBUG] Строка для подписи: {data_string}")
        sign = self._generate_md5(data_string)
        print(f"[DEBUG] Подпись: {sign}")
        return sign

    def _fetch_data(self):
        """
        Выполняет запрос к API RealtyCalendar для получения данных о бронированиях.
        """
        base_url = f"https://realtycalendar.ru/api/v1/bookings/{self.public_key}/"
        headers = {
            "Accept": "application/json",
            "Content-Type": "application/json",
        }

        # Определяем даты выборки
        now = datetime.now()
        data = {
            "begin_date": (now - timedelta(days=7)).strftime("%Y-%m-%d"),
            "end_date": now.strftime("%Y-%m-%d"),
        }

        print(f"[DEBUG] Даты выборки: {data}")

        # Генерация подписи
        data["sign"] = self._generate_sign(data)

        # Отправляем запрос
        print(f"[DEBUG] URL запроса: {base_url}")
        print(f"[DEBUG] Заголовки: {headers}")
        print(f"[DEBUG] Данные запроса: {data}")

        response = requests.post(url=base_url, headers=headers, json=data)

        # Логируем результат
        print(f"[DEBUG] Статус ответа: {response.status_code}")
        print(f"[DEBUG] Ответ: {response.text}")

        # Проверяем успешность запроса
        if response.status_code == 200:
            bookings = response.json().get("bookings", [])
            print(f"[DEBUG] Полученные данные бронирований: {bookings}")
            return bookings
        else:
            raise ValueError(f"Ошибка API RealtyCalendar: {response.status_code}, {response.text}")


    async def _save_to_db(self, data, hotel_id):
        """
        Сохраняет данные о бронированиях в базу данных.
        """
        from hotels.models import Reservation, Hotel

        hotel = await sync_to_async(Hotel.objects.get)(id=hotel_id)
        print(f"[DEBUG] Загружен отель: {hotel.name}")

        for item in data:
            print(f"[DEBUG] Обработка бронирования: {item}")
            try:
                reservation, created = await sync_to_async(Reservation.objects.update_or_create)(
                    reservation_id=item["id"],
                    hotel=hotel,
                    defaults={
                        "room_number": item.get("apartment_id", ""),  # ID квартиры
                        "check_in": datetime.strptime(item["begin_date"], "%Y-%m-%d"),  # Дата заезда
                        "check_out": datetime.strptime(item["end_date"], "%Y-%m-%d"),  # Дата выезда
                        "status": item.get("status", ""),  # Статус бронирования
                        "price": item.get("amount", 0),  # Сумма оплаты
                        "client_name": item["client"].get("fio", ""),  # Имя клиента
                        "client_email": item["client"].get("email", ""),  # Email клиента
                        "client_phone": item["client"].get("phone", ""),  # Телефон клиента
                    }
                )
                print(f"[DEBUG] {'Создана' if created else 'Обновлена'} запись: {reservation}")
            except Exception as e:
                print(f"[DEBUG] Ошибка при сохранении бронирования ID {item['id']}: {e}")
