"""
Диагностический скрипт для проверки создания категорий активов.

Использование:
bench --site <site-name> execute jey_erp.debug_asset_categories.diagnose
"""

import frappe


def diagnose():
    """Проверяет состояние системы и причину отсутствия категорий активов"""

    print("\n" + "=" * 80)
    print("ДИАГНОСТИКА: Создание категорий активов")
    print("=" * 80 + "\n")

    # 1. Проверка существования компании
    print("1. Проверка компаний:")
    companies = frappe.get_all("Company", fields=["name", "country"])
    if companies:
        print(f"   ✓ Найдено компаний: {len(companies)}")
        for idx, comp in enumerate(companies, 1):
            print(f"     {idx}. {comp.name} (Country: {comp.get('country', 'N/A')})")
    else:
        print("   ✗ Компании не найдены!")
        return

    # 2. Проверка категорий активов
    print("\n2. Проверка категорий активов:")
    from jey_erp.custom.create_asset_categories import get_system_asset_categories

    system_categories = get_system_asset_categories()
    print(f"   Системных категорий должно быть: {len(system_categories)}")

    existing_categories = frappe.get_all(
        "Asset Category",
        filters={"asset_category_name": ["in", system_categories]},
        pluck="asset_category_name"
    )

    if existing_categories:
        print(f"   ✓ Найдено категорий: {len(existing_categories)}")
        for cat in existing_categories:
            print(f"     - {cat}")
    else:
        print(f"   ✗ Категории не найдены (0 из {len(system_categories)})")

    # 3. Проверка счетов
    print("\n3. Проверка необходимых счетов:")
    company_name = companies[0].name

    required_accounts = [
        "Tikililər üzrə yığılmış amortizasiya",
        "Amortizasiya xərci",
        "Digər uzunmüddətli aktivlər"
    ]

    for account_name in required_accounts:
        account = frappe.db.get_value(
            "Account",
            {"account_name": account_name, "company": company_name},
            "name"
        )
        if account:
            print(f"   ✓ {account_name}: {account}")
        else:
            print(f"   ✗ {account_name}: НЕ НАЙДЕН!")

    # 4. Проверка Error Log
    print("\n4. Проверка логов ошибок (последние 10):")
    error_logs = frappe.get_all(
        "Error Log",
        filters={
            "error": ["like", "%Asset Categories%"]
        },
        fields=["name", "creation", "error"],
        order_by="creation desc",
        limit=10
    )

    if error_logs:
        print(f"   Найдено логов: {len(error_logs)}")
        for log in error_logs:
            print(f"\n   [{log.creation}] {log.name}")
            print(f"   {log.error[:200]}...")
    else:
        print("   Логи не найдены")

    # 5. Проверка хука
    print("\n5. Проверка doc_events на Company:")
    company_events = frappe.get_hooks("doc_events", {}).get("Company", {})
    on_update_hooks = company_events.get("on_update", [])

    if on_update_hooks:
        print(f"   ✓ Company.on_update хуки зарегистрированы:")
        if isinstance(on_update_hooks, str):
            on_update_hooks = [on_update_hooks]
        for hook in on_update_hooks:
            status = "✓" if "asset_categories" in hook.lower() else " "
            print(f"     {status} {hook}")
    else:
        print("   ✗ Company.on_update хуки НЕ зарегистрированы!")

    # 6. Проверка фоновых задач
    print("\n6. Проверка фоновых задач:")
    try:
        import redis
        from rq import Queue

        # Get redis connection
        redis_server = frappe.conf.redis_queue or "redis://localhost:11000"
        conn = redis.from_url(redis_server)

        q = Queue('default', connection=conn)
        jobs = list(q.jobs)

        if jobs:
            print(f"   В очереди задач: {len(jobs)}")
            for job in jobs[:5]:  # Show first 5
                print(f"     - {job.func_name}")
        else:
            print("   Очередь пуста")

        # Проверка failed jobs
        try:
            failed_q = Queue('failed', connection=conn)
            failed_jobs = list(failed_q.jobs)
            if failed_jobs:
                print(f"\n   FAILED задач: {len(failed_jobs)}")
                for job in failed_jobs[:5]:  # Show first 5
                    print(f"     ✗ {job.func_name}")
                    if hasattr(job, 'exc_info') and job.exc_info:
                        print(f"       Error: {str(job.exc_info)[:100]}")
        except Exception as e:
            print(f"   Не удалось проверить failed jobs: {str(e)}")
    except Exception as e:
        print(f"   Ошибка проверки очереди: {str(e)}")

    print("\n" + "=" * 80)
    print("ДИАГНОСТИКА ЗАВЕРШЕНА")
    print("=" * 80 + "\n")


def force_create():
    """Принудительно создает категории активов для первой компании"""

    print("\n" + "=" * 80)
    print("ПРИНУДИТЕЛЬНОЕ СОЗДАНИЕ КАТЕГОРИЙ АКТИВОВ")
    print("=" * 80 + "\n")

    companies = frappe.get_all("Company", limit=1)
    if not companies:
        print("✗ Компании не найдены!")
        return

    company_name = companies[0].name
    print(f"Создание категорий для компании: {company_name}\n")

    from jey_erp.custom.create_asset_categories import create_asset_categories_for_company

    create_asset_categories_for_company(company_name)

    print("\n" + "=" * 80)
    print("СОЗДАНИЕ ЗАВЕРШЕНО")
    print("=" * 80 + "\n")


def test_hook():
    """Тестирует вызов Company.on_update хука напрямую"""

    print("\n" + "=" * 80)
    print("ТЕСТ ХУКА Company.on_update")
    print("=" * 80 + "\n")

    # Проверяем, что хук зарегистрирован
    company_events = frappe.get_hooks("doc_events", {}).get("Company", {})
    on_update_hooks = company_events.get("on_update", [])

    print(f"Зарегистрированные Company.on_update хуки: {on_update_hooks}\n")

    if not on_update_hooks:
        print("✗ Company.on_update хук НЕ зарегистрирован в hooks.py!")
        return

    # Получаем первую компанию
    companies = frappe.get_all("Company", limit=1)
    if not companies:
        print("✗ Компании не найдены! Создайте компанию сначала.")
        return

    company_name = companies[0].name
    print(f"Компания найдена: {company_name}\n")

    # Получаем Company document
    print("Загружаем Company document...\n")
    company_doc = frappe.get_doc("Company", company_name)

    # Вызываем хук напрямую
    print("Вызываем хук напрямую...\n")

    try:
        from jey_erp.custom.create_asset_categories import create_asset_categories_on_company_update

        create_asset_categories_on_company_update(company_doc, "on_update")

        print("\n✓ Хук вызван успешно!")
        print("\nПроверьте Error Log для записей с префиксом 'AC'")
        print("\nИли проверьте категории:")
        print(">>> frappe.db.count('Asset Category')")

    except Exception as e:
        import traceback
        print(f"\n✗ Ошибка при вызове хука!")
        print(f"Error: {str(e)}")
        print(f"\nTraceback:\n{traceback.format_exc()}")

    print("\n" + "=" * 80)
    print("ТЕСТ ЗАВЕРШЕН")
    print("=" * 80 + "\n")
