"""
Response schema definitions.
"""

from typing import Any, Dict, Optional, Generic, TypeVar
from pydantic import BaseModel, Field
from datetime import datetime
from starlette import status

T = TypeVar('T')


class BaseResponse(BaseModel, Generic[T]):
    """Generic base response schema."""
    
    success: bool = Field(True, description="Request success status")
    message: Optional[str] = Field(None, description="Response message")
    data: Optional[T] = Field(None, description="Response data")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Response timestamp")


class ListResponse(BaseModel, Generic[T]):
    """Generic list response with pagination."""
    
    items: list[T] = Field(..., description="List of items")
    total: int = Field(..., description="Total number of items")
    page: int = Field(..., description="Current page")
    per_page: int = Field(..., description="Items per page")
    pages: int = Field(..., description="Total pages")
    has_next: bool = Field(..., description="Has next page")
    has_prev: bool = Field(..., description="Has previous page")


class ErrorDetail(BaseModel):
    """Error detail schema."""
    
    field: Optional[str] = Field(None, description="Field that caused the error")
    message: str = Field(..., description="Error message")
    code: Optional[str] = Field(None, description="Error code")


class ErrorResponse(BaseModel):
    """Error response schema."""
    
    success: bool = Field(False, description="Always false for errors")
    error: str = Field(..., description="Main error message")
    details: Optional[list[ErrorDetail]] = Field(None, description="Detailed error information")
    timestamp: datetime = Field(default_factory=datetime.utcnow, description="Error timestamp")

class ErrorResponseModel(BaseModel):
    """
    Base Error Model
    """

    error: Any = {}
    status_code: int = status.HTTP_500_INTERNAL_SERVER_ERROR
    success: bool = False
    message: str = "Request could not be processed"


class SuccessResponse(BaseModel):
    """Simple success response."""
    
    success: bool = Field(True, description="Success status")
    message: str = Field(..., description="Success message")


class CreatedResponse(BaseModel, Generic[T]):
    """Response for created resources."""
    
    success: bool = Field(True, description="Creation success status")
    message: str = Field("Resource created successfully", description="Success message")
    data: T = Field(..., description="Created resource data")
    id: Optional[int] = Field(None, description="Created resource ID")
