"""
Schema configuration for API documentation
"""
from drf_yasg import openapi
from drf_yasg.inspectors import SwaggerAutoSchema
from drf_yasg.utils import swagger_auto_schema
from drf_yasg.generators import OpenAPISchemaGenerator

class ModuleTaggingAutoSchema(SwaggerAutoSchema):
    """
    Custom schema generator that automatically tags operations based on their module
    """
    def get_tags(self, operation_keys):
        # Extract module name from the operation keys
        if len(operation_keys) > 1:
            # Use the first part of the URL path as the tag (e.g., 'employee', 'attendance')
            return [operation_keys[0]]
        return super().get_tags(operation_keys)


class OrderedTagSchemaGenerator(OpenAPISchemaGenerator):
    """
    Custom schema generator to enforce tag ordering.

    Places 'auth' first, followed by remaining tags sorted alphabetically.
    """
    def get_schema(self, request=None, public=False):
        schema = super().get_schema(request=request, public=public)

        # Collect all tag names used in operations
        tag_names = set()
        for path_item in schema.paths.values():
            for method_name in ("get", "put", "post", "delete", "options", "head", "patch", "trace"):
                operation = getattr(path_item, method_name, None)
                if operation and getattr(operation, "tags", None):
                    for t in operation.tags:
                        if t:
                            tag_names.add(t)

        # Desired order: 'auth' first, then others alphabetically
        ordered_names = ["auth"] + sorted([t for t in tag_names if t != "auth"])

        # Build top-level tags list in the specified order
        schema.tags = [{"name": name} for name in ordered_names]
        return schema

def api_doc(**kwargs):
    """
    Decorator for documenting API views
    
    Example usage:
    
    @api_doc(
        responses={200: EmployeeSerializer(many=True)},
        operation_description="List all employees",
        tags=['Employee']
    )
    def get(self, request):
        ...
    """
    return swagger_auto_schema(**kwargs)

# Common response schemas
error_response = openapi.Schema(
    type=openapi.TYPE_OBJECT,
    properties={
        'error': openapi.Schema(type=openapi.TYPE_STRING),
        'detail': openapi.Schema(type=openapi.TYPE_STRING),
    }
)

success_response = openapi.Schema(
    type=openapi.TYPE_OBJECT,
    properties={
        'success': openapi.Schema(type=openapi.TYPE_BOOLEAN),
        'message': openapi.Schema(type=openapi.TYPE_STRING),
    }
)

# Common parameters
pagination_params = [
    openapi.Parameter('page', openapi.IN_QUERY, description="Page number", type=openapi.TYPE_INTEGER),
    openapi.Parameter('page_size', openapi.IN_QUERY, description="Number of results per page", type=openapi.TYPE_INTEGER),
]

# Security definitions are already configured in rest_conf.py