"""
Call CRM API - Python Example

Use an access token to make authenticated API calls
"""

import os
import requests
from typing import List, Dict, Optional
from get_token import get_access_token

# Configuration - Load from environment variables (raises KeyError if missing)
API_BASE_URL = os.environ["API_BASE_URL"]


def get_products(access_token: str, limit: int = 10) -> Dict:
    """
    Get products from the CRM API.

    Args:
        access_token: OAuth access token
        limit: Maximum number of products to return

    Returns:
        dict: API response with products list

    Raises:
        requests.HTTPError: If the API request fails
    """
    response = requests.get(
        f"{API_BASE_URL}/products",
        params={"limit": limit},
        headers={"Authorization": f"Bearer {access_token}"},
    )

    if response.status_code != 200:
        error_data = response.json()
        raise requests.HTTPError(
            f"API request failed: {response.status_code} - "
            f"{error_data.get('message', response.text)}"
        )

    data = response.json()
    print(f"✅ Retrieved {len(data['products'])} products")
    return data


def search_products(access_token: str, query: str) -> Dict:
    """
    Search products by query.

    Args:
        access_token: OAuth access token
        query: Search query string

    Returns:
        dict: API response with matching products

    Raises:
        requests.HTTPError: If the search request fails
    """
    response = requests.get(
        f"{API_BASE_URL}/products/search",
        params={"q": query},
        headers={"Authorization": f"Bearer {access_token}"},
    )

    if response.status_code != 200:
        error_data = response.json()
        raise requests.HTTPError(
            f"Search failed: {response.status_code} - "
            f"{error_data.get('message', response.text)}"
        )

    data = response.json()
    print(f"✅ Found {len(data['products'])} products matching \"{query}\"")
    return data


def get_product(access_token: str, product_id: str) -> Optional[Dict]:
    """
    Get a single product by ID.

    Args:
        access_token: OAuth access token
        product_id: Product ID

    Returns:
        dict: Product data, or None if not found

    Raises:
        requests.HTTPError: If the API request fails (except 404)
    """
    response = requests.get(
        f"{API_BASE_URL}/products/{product_id}",
        headers={"Authorization": f"Bearer {access_token}"},
    )

    if response.status_code == 404:
        print("❌ Product not found")
        return None

    if response.status_code != 200:
        error_data = response.json()
        raise requests.HTTPError(
            f"API request failed: {response.status_code} - "
            f"{error_data.get('message', response.text)}"
        )

    product = response.json()
    print(f"✅ Retrieved product: {product['name']}")
    return product


def main():
    """Main example function"""
    try:
        # Step 1: Get access token
        print("🔐 Obtaining access token...\n")
        access_token = get_access_token()

        # Step 2: Get products
        print("\n📦 Fetching products...\n")
        products_data = get_products(access_token, limit=5)

        print("\nProducts:")
        for product in products_data["products"]:
            print(
                f"  - {product['productCode']}: {product['name']} "
                f"(R{product['price']})"
            )

        # Step 3: Search example (if needed)
        # search_results = search_products(access_token, "widget")

        # Step 4: Get single product (if products exist)
        if products_data["products"]:
            first_product = products_data["products"][0]
            print(f"\n🔍 Fetching details for: {first_product['name']}\n")
            get_product(access_token, first_product["id"])

        print("\n✅ All API calls completed successfully!")

    except Exception as e:
        print(f"\n❌ Error: {e}")
        exit(1)


if __name__ == "__main__":
    main()
