"""
Grubtech Menu Sync - Python

This example demonstrates how to push menu data to Grubtech API.

Prerequisites:
- Python 3.8+
- requests library (pip install requests)
- Valid access token from authentication

Replace the following placeholders:
- {{AUTH_TOKEN}}: Access token from authentication step
- {{MENU_DATA}}: Your menu data in the required format
"""

import requests
import sys
from typing import Dict, Any, List

AUTH_TOKEN = '{{AUTH_TOKEN}}'
BASE_URL = 'https://api.staging.grubtech.io'

# Example menu data structure
# Replace this with your actual menu data
MENU_DATA: Dict[str, Any] = {
    'name': 'Restaurant Menu',
    'description': 'Main menu with categories and items',
    'categories': [
        {
            'id': 'cat-1',
            'name': 'Appetizers',
            'description': 'Start your meal right',
            'sortOrder': 1,
            'items': [
                {
                    'id': 'item-1',
                    'name': 'Spring Rolls',
                    'description': 'Crispy vegetable spring rolls',
                    'price': 8.99,
                    'available': True,
                    'modifiers': [
                        {
                            'id': 'mod-1',
                            'name': 'Extra Sauce',
                            'price': 1.50,
                            'available': True,
                        },
                    ],
                },
            ],
        },
        {
            'id': 'cat-2',
            'name': 'Main Courses',
            'description': 'Delicious entrees',
            'sortOrder': 2,
            'items': [
                {
                    'id': 'item-2',
                    'name': 'Grilled Chicken',
                    'description': 'Tender chicken with herbs',
                    'price': 15.99,
                    'available': True,
                    'modifiers': [],
                },
            ],
        },
    ],
}


def create_menu(menu_data: Dict[str, Any]) -> str:
    """
    Push menu data to Grubtech API

    Args:
        menu_data: Menu data dictionary

    Returns:
        str: Menu ID from response

    Raises:
        Exception: If menu creation fails
    """
    try:
        # Validate menu data before sending
        if not menu_data.get('categories') or len(menu_data['categories']) == 0:
            raise ValueError('Menu must have at least one category')

        # Make menu creation request
        url = f'{BASE_URL}/v1/menus'
        headers = {
            'Authorization': f'Bearer {AUTH_TOKEN}',
            'Content-Type': 'application/json',
        }

        response = requests.post(url, json=menu_data, headers=headers, timeout=30)

        # Check for errors
        if not response.ok:
            raise Exception(
                f'Menu creation failed: {response.status_code} - {response.text}'
            )

        # Extract menu ID from response
        data: Dict[str, Any] = response.json()
        menu_id = data['menuId']

        print(f'✅ Menu created successfully!')
        print(f'Menu ID: {menu_id}')
        print(f'Status: {data.get("status", "unknown")}')

        return menu_id

    except requests.RequestException as e:
        print(f'❌ Menu creation error: {e}', file=sys.stderr)
        raise
    except Exception as e:
        print(f'❌ Unexpected error: {e}', file=sys.stderr)
        raise


def update_menu(menu_id: str, menu_data: Dict[str, Any]) -> None:
    """
    Update existing menu

    Args:
        menu_id: ID of the menu to update
        menu_data: Updated menu data
    """
    try:
        url = f'{BASE_URL}/v1/menus/{menu_id}'
        headers = {
            'Authorization': f'Bearer {AUTH_TOKEN}',
            'Content-Type': 'application/json',
        }

        response = requests.put(url, json=menu_data, headers=headers, timeout=30)

        if not response.ok:
            raise Exception(f'Menu update failed: {response.status_code} - {response.text}')

        print(f'✅ Menu updated successfully!')

    except Exception as e:
        print(f'❌ Menu update error: {e}', file=sys.stderr)
        raise


if __name__ == '__main__':
    try:
        # Create new menu
        menu_id = create_menu(MENU_DATA)

        # Optionally update the menu
        # update_menu(menu_id, MENU_DATA)

    except Exception as e:
        sys.exit(1)
