"""
Helper functions for route building
Provides convenience methods for common routing patterns
"""

from typing import Optional


def build_base_route(service: str, resource: str, tenant_id: Optional[str] = None) -> str:
    """
    Build a base CRUD route

    Args:
        service: Service name
        resource: Resource name
        tenant_id: Optional tenant ID (if None, uses {tenant_id} placeholder)

    Returns:
        Complete route path

    Example:
        build_base_route('inventory', 'ingredients')
        # Returns: '/api/v1/tenants/{tenant_id}/inventory/ingredients'

        build_base_route('inventory', 'ingredients', 'uuid-123')
        # Returns: '/api/v1/tenants/uuid-123/inventory/ingredients'
    """
    tenant_part = tenant_id if tenant_id else "{tenant_id}"
    return f"/api/v1/tenants/{tenant_part}/{service}/{resource}"


def build_dashboard_route(service: str, operation: str, tenant_id: Optional[str] = None) -> str:
    """
    Build a dashboard route

    Args:
        service: Service name
        operation: Dashboard operation
        tenant_id: Optional tenant ID

    Returns:
        Complete route path

    Example:
        build_dashboard_route('production', 'summary')
        # Returns: '/api/v1/tenants/{tenant_id}/production/dashboard/summary'
    """
    tenant_part = tenant_id if tenant_id else "{tenant_id}"
    return f"/api/v1/tenants/{tenant_part}/{service}/dashboard/{operation}"


def build_analytics_route(service: str, operation: str, tenant_id: Optional[str] = None) -> str:
    """
    Build an analytics route

    Args:
        service: Service name
        operation: Analytics operation
        tenant_id: Optional tenant ID

    Returns:
        Complete route path

    Example:
        build_analytics_route('production', 'equipment-efficiency')
        # Returns: '/api/v1/tenants/{tenant_id}/production/analytics/equipment-efficiency'
    """
    tenant_part = tenant_id if tenant_id else "{tenant_id}"
    return f"/api/v1/tenants/{tenant_part}/{service}/analytics/{operation}"


def build_operations_route(service: str, operation: str, tenant_id: Optional[str] = None) -> str:
    """
    Build a service operations route

    Args:
        service: Service name
        operation: Operation name
        tenant_id: Optional tenant ID

    Returns:
        Complete route path

    Example:
        build_operations_route('production', 'schedule-batch')
        # Returns: '/api/v1/tenants/{tenant_id}/production/operations/schedule-batch'
    """
    tenant_part = tenant_id if tenant_id else "{tenant_id}"
    return f"/api/v1/tenants/{tenant_part}/{service}/operations/{operation}"


def build_resource_detail_route(
    service: str,
    resource: str,
    resource_id: Optional[str] = None,
    tenant_id: Optional[str] = None,
    id_param_name: str = "id"
) -> str:
    """
    Build a route for individual resource details

    Args:
        service: Service name
        resource: Resource name
        resource_id: Optional resource ID (if None, uses parameter name)
        tenant_id: Optional tenant ID
        id_param_name: Name of ID parameter when resource_id is None

    Returns:
        Complete route path

    Example:
        build_resource_detail_route('inventory', 'ingredients', id_param_name='ingredient_id')
        # Returns: '/api/v1/tenants/{tenant_id}/inventory/ingredients/{ingredient_id}'

        build_resource_detail_route('inventory', 'ingredients', 'uuid-456', 'uuid-123')
        # Returns: '/api/v1/tenants/uuid-123/inventory/ingredients/uuid-456'
    """
    base = build_base_route(service, resource, tenant_id)
    id_part = resource_id if resource_id else f"{{{id_param_name}}}"
    return f"{base}/{id_part}"


def build_nested_route(
    service: str,
    parent_resource: str,
    child_resource: str,
    parent_id: Optional[str] = None,
    tenant_id: Optional[str] = None,
    parent_id_param: str = "parent_id"
) -> str:
    """
    Build a route for nested resources

    Args:
        service: Service name
        parent_resource: Parent resource name
        child_resource: Child resource name
        parent_id: Optional parent resource ID
        tenant_id: Optional tenant ID
        parent_id_param: Parent ID parameter name when parent_id is None

    Returns:
        Complete route path

    Example:
        build_nested_route('inventory', 'ingredients', 'stock', parent_id_param='ingredient_id')
        # Returns: '/api/v1/tenants/{tenant_id}/inventory/ingredients/{ingredient_id}/stock'
    """
    parent = build_resource_detail_route(service, parent_resource, parent_id, tenant_id, parent_id_param)
    return f"{parent}/{child_resource}"


def extract_tenant_id_from_route(route_path: str) -> Optional[str]:
    """
    Extract tenant ID from a route path

    Args:
        route_path: Route path containing tenant ID

    Returns:
        Tenant ID if found, None otherwise

    Example:
        extract_tenant_id_from_route('/api/v1/tenants/uuid-123/inventory/ingredients')
        # Returns: 'uuid-123'
    """
    import re
    match = re.search(r'/api/v1/tenants/([^/]+)/', route_path)
    return match.group(1) if match else None


def extract_service_from_route(route_path: str) -> Optional[str]:
    """
    Extract service name from a route path

    Args:
        route_path: Route path containing service name

    Returns:
        Service name if found, None otherwise

    Example:
        extract_service_from_route('/api/v1/tenants/uuid-123/inventory/ingredients')
        # Returns: 'inventory'
    """
    import re
    match = re.search(r'/api/v1/tenants/[^/]+/([^/]+)/', route_path)
    return match.group(1) if match else None


def is_analytics_route(route_path: str) -> bool:
    """Check if route is an analytics route"""
    return '/analytics/' in route_path


def is_dashboard_route(route_path: str) -> bool:
    """Check if route is a dashboard route"""
    return '/dashboard/' in route_path


def is_operations_route(route_path: str) -> bool:
    """Check if route is an operations route"""
    return '/operations/' in route_path


def is_base_crud_route(route_path: str) -> bool:
    """Check if route is a base CRUD route"""
    return not (is_analytics_route(route_path) or
                is_dashboard_route(route_path) or
                is_operations_route(route_path))
