"""
Тестовый скрипт для проверки работы сервисов Bitrix24.

Запускает по одному методу каждого сервиса для проверки их работоспособности.
"""

import asyncio
import sys
from typing import Any

from app.application.services import ContactService, DealService
from app.infrastructure.ioc import container
from app.infrastructure.logging.logger import logger


async def test_contact_service() -> dict[str, Any]:
    """
    Тестирование сервиса контактов.

    :return: Результаты тестирования
    """
    logger.info("Тестирование сервиса контактов")

    contact_service = container.get(ContactService)
    results = {}

    contacts = await contact_service.list_contacts(limit=5)
    results["list_contacts"] = {
        "success": len(contacts) >= 0,
        "count": len(contacts),
        "first_contact_id": contacts[0].id if contacts else None,
    }

    if contacts:
        contact_id = contacts[0].id
        contact = await contact_service.get_contact_by_id(contact_id)
        results["get_contact_by_id"] = {
            "success": contact is not None,
            "contact_id": contact_id,
            "name": contact.get_full_name() if contact else None,
        }

        # Поиск контактов по имени
        if contact and contact.name:
            search_query = contact.name
            search_results = await contact_service.search_contacts(
                search_query,
                "name",
                5,
            )
            results["search_contacts"] = {
                "success": len(search_results) >= 0,
                "query": search_query,
                "count": len(search_results),
            }

    return results


async def test_deal_service() -> dict[str, Any]:
    """
    Тестирование сервиса сделок.

    :return: Результаты тестирования
    """
    logger.info("Тестирование сервиса сделок")

    deal_service = container.get(DealService)
    results = {}

    # Получение списка сделок
    deals = await deal_service.list_deals(limit=5)
    results["list_deals"] = {
        "success": len(deals) >= 0,
        "count": len(deals),
        "first_deal_id": deals[0].id if deals else None,
    }

    # Если есть сделки, получаем детали первой сделки
    if deals:
        deal_id = deals[0].id
        deal = await deal_service.get_deal_by_id(deal_id)
        results["get_deal_by_id"] = {
            "success": deal is not None,
            "deal_id": deal_id,
            "title": deal.title if deal else None,
        }

    return results


async def run_tests() -> None:
    """
    Запуск всех тестов.
    """
    try:
        logger.info("Запуск тестирования сервисов Bitrix24")

        contact_results = await test_contact_service()
        deal_results = await test_deal_service()

        # Вывод результатов
        logger.info("===== Результаты тестирования =====")
        logger.info(f"Сервис контактов: {contact_results}")
        logger.info(f"Сервис сделок: {deal_results}")

        logger.info("Тестирование завершено успешно")
    except Exception as e:
        logger.error(f"Ошибка при выполнении тестов: {e}")
        raise


def main() -> None:
    """
    Точка входа в скрипт тестирования.
    """
    try:
        asyncio.run(run_tests())
    except KeyboardInterrupt:
        logger.info("Тестирование прервано пользователем")
    except Exception as e:
        logger.error(f"Критическая ошибка: {e}")
        sys.exit(1)


if __name__ == "__main__":
    main()
