from pydantic import BaseModel, Field, field_validator
from typing import Optional, List, Union
from uuid import UUID
from datetime import datetime


class PermissionBase(BaseModel):
    name: str = Field(..., description="Permission identifier")
    display_name: Optional[str] = Field(None, description="Human-readable permission name")
    description: Optional[str] = Field(None, description="Permission description")
    category: str = Field(..., description="Permission category")
    endpoint_pattern: Optional[str] = Field(None, description="API endpoint pattern (e.g., 'POST /api/streams')")


class PermissionCreate(PermissionBase):
    pass


class PermissionUpdate(BaseModel):
    name: Optional[str] = None
    display_name: Optional[str] = None
    description: Optional[str] = None
    category: Optional[str] = None
    endpoint_pattern: Optional[str] = None
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


class PermissionResponse(PermissionBase):
    id: UUID
    created_at: datetime
    updated_at: datetime

    class Config:
        from_attributes = True


class RoleBase(BaseModel):
    name: str = Field(..., description="Role name")
    description: Optional[str] = Field(None, description="Role description")
    color: Optional[str] = Field(None, description="Role color (hex code)")
    icon: Optional[str] = Field(None, description="Role icon name")
    is_default: bool = Field(default=False, description="Is default role")
    priority: int = Field(default=0, description="Role priority for role hierarchy (higher = more privileged)")


class RoleCreate(RoleBase):
    permission_ids: Optional[List[UUID]] = Field(None, description="List of permission IDs to assign")


class RoleUpdate(BaseModel):
    name: Optional[str] = None
    description: Optional[str] = None
    color: Optional[str] = None
    icon: Optional[str] = None
    is_default: Optional[bool] = None
    priority: Optional[int] = None
    permission_ids: Optional[List[UUID]] = Field(None, description="List of permission IDs to assign")
    created_at: Optional[datetime] = None
    updated_at: Optional[datetime] = None


class RoleResponse(RoleBase):
    id: UUID
    created_at: datetime
    updated_at: datetime
    permissions: List[PermissionResponse] = []

    @field_validator('is_default', mode='before')
    @classmethod
    def validate_is_default(cls, v):
        if v is None:
            return False
        if isinstance(v, bool):
            return v
        return bool(v)

    @field_validator('permissions', mode='before')
    @classmethod
    def convert_role_permissions(cls, v):
        """Convert RolePermission objects to Permission objects automatically."""
        if v is None:
            return []
        result = []
        for item in v:
            # If item is RolePermission, extract the permission
            if hasattr(item, 'permission'):
                result.append(item.permission)
            else:
                result.append(item)
        return result


    class Config:
        from_attributes = True


class RolePermissionCreate(BaseModel):
    role_id: UUID = Field(..., description="Role ID to assign permission to")
    permission_id: UUID = Field(..., description="Permission ID to assign")
    created_at: Optional[datetime] = None


class RolePermissionBulkUpdate(BaseModel):
    permission_ids: List[UUID] = Field(..., description="List of permission IDs to assign")


class RolePermissionsResponse(BaseModel):
    role_id: UUID
    role_name: str
    permissions: List[PermissionResponse]
