import requests
import json
import os
from dotenv import load_dotenv

load_dotenv()

def fetch_invoices(api_url, api_key=None, params=None):
    """
    Запрашивает счета с API по указанному URL.
    
    Параметры:
        api_url (str): URL для получения счетов.
        api_key (str, optional): API ключ для авторизации.
        params (dict, optional): Параметры запроса.
    
    Возвращает:
        dict: Декодированный JSON-ответ при успешном запросе или None в случае ошибки.
    """
    headers = {
        "accept": "application/ld+json"
    }
    if api_key:
        headers["X-API-Key"] = api_key

    try:
        response = requests.get(api_url, headers=headers, params=params)
        response.raise_for_status()
        return response.json()
    except requests.exceptions.RequestException as e:
        print(f"Ошибка при запросе счетов: {e}")
        return None

def print_invoice(invoice):
    """
    Выводит информацию об одном счёте.
    """
    print("-" * 60)
    print(f"Invoice: {invoice.get('@id', 'N/A')}")
    print(f"  Type: {invoice.get('@type', 'N/A')}")
    print(f"  Created at: {invoice.get('created_at', 'N/A')}")
    print(f"  Closed at: {invoice.get('closed_at', 'N/A')}")
    print(f"  External ID: {invoice.get('ext_id', 'N/A')}")
    print(f"  External Type: {invoice.get('ext_type', 'N/A')}")
    
    # Данные клиента
    client = invoice.get("client", {})
    print("  Client:")
    print(f"    ID: {client.get('@id', 'N/A')}")
    print(f"    Type: {client.get('@type', 'N/A')}")
    print(f"    Name: {client.get('name', 'N/A')}")
    print(f"    Club Card Number: {client.get('club_card_num', 'N/A')}")
    
    # Финансовые данные
    print(f"  Sum: {invoice.get('sum', 'N/A')}")
    print(f"  Company Number: {invoice.get('comp_num', 'N/A')}")
    print(f"  Bonus: {invoice.get('bonus', 'N/A')}")
    print(f"  Start Bonus: {invoice.get('start_bonus', 'N/A')}")
    print(f"  Deposit Sum: {invoice.get('deposit_sum', 'N/A')}")
    print(f"  Notes: {invoice.get('notes', 'N/A')}")
    print("-" * 60)

def print_view(view):
    """
    Выводит информацию о навигации (пагинация) коллекции.
    """
    print("\nНавигация коллекции:")
    print(f"  View ID: {view.get('@id', 'N/A')}")
    print(f"  Type: {view.get('@type', 'N/A')}")
    print(f"  First page: {view.get('first', 'N/A')}")
    print(f"  Last page: {view.get('last', 'N/A')}")
    print(f"  Previous page: {view.get('previous', 'N/A')}")
    print(f"  Next page: {view.get('next', 'N/A')}")

def print_search(search):
    """
    Выводит информацию о параметрах поиска.
    """
    print("\nПараметры поиска:")
    print(f"  Type: {search.get('@type', 'N/A')}")
    print(f"  Template: {search.get('template', 'N/A')}")
    print(f"  Variable Representation: {search.get('variableRepresentation', 'N/A')}")
    mapping = search.get('mapping', [])
    if mapping:
        print("  Mapping:")
        for m in mapping:
            print(f"    Variable: {m.get('variable', 'N/A')}")
            print(f"      Property: {m.get('property', 'N/A')}")
            print(f"      Required: {m.get('required', 'N/A')}")
    else:
        print("  Mapping: N/A")

def print_invoices_data(data):
    """
    Анализирует и выводит всю информацию, полученную от API.
    """
    total_items = data.get("totalItems", 0)
    print(f"\nОбщее количество счетов: {total_items}\n")

    # Разбор счетов
    members = data.get("member", [])
    if members:
        print("Счета:")
        for invoice in members:
            print_invoice(invoice)
    else:
        print("Счета не найдены.")

    # Разбор навигационной информации
    view = data.get("view")
    if view:
        print_view(view)
    else:
        print("\nИнформация о навигации не предоставлена.")

    # Разбор параметров поиска
    search = data.get("search")
    if search:
        print_search(search)
    else:
        print("\nИнформация о параметрах поиска не предоставлена.")

if __name__ == '__main__':
    base_url = "http://10.8.0.4:8000/api/invoices"
    params = {
        "page": 1,
        "created_at[before]": "2025-03-05",  # можно изменить диапазон дат по необходимости
        "created_at[after]": "2025-02-01"
    }
    api_key = os.getenv("API_KEY")  # Если API-ключ не требуется, можно оставить None

    data = fetch_invoices(base_url, api_key, params)

    if data is not None:
        print_invoices_data(data)
    else:
        print("Не удалось получить данные счетов с API.")
