from pydantic import BaseModel, EmailStr, Field, validator
from typing import Any, Optional, List
from fastapi import HTTPException

class Token(BaseModel):
    access_token: str
    token_type: str

class TokenData(BaseModel):
    email: EmailStr


class UserCreate(BaseModel):
    name: str
    email: str
    org_id: Optional[str] = None
    org_name: Optional[str] = None
    plan: Optional[str] = None
    welcome_email: Optional[str] = None
    
    @validator("*", pre=True, always=True)
    def strip_whitespace(cls, value):
        if isinstance(value, str):
            return value.strip()
        return value
        
    # Optional: Validate specific fields
    @validator("org_name")
    def validate_org_name(cls, value):
        if any(char in value for char in "\[]}{\\$&%#@)()+!^."):
            # raise ValueError("Organization name must contain alphanumeric characters only")
            raise HTTPException(
                status_code=400,
                detail="Organization name must contain alphanumeric characters only."
            )
        return value

class UserResponse(BaseModel):
    # id: int
    token: Optional[str] = None
    name: Optional[str] = None
    email: Optional[str] = None
    org_id: Optional[str] = None
    org_name: Optional[str] = None
    allocated_storage: Optional[int] = None
    folder_limit: Optional[int] = None
    plan: Optional[str] = None

    class Config:
        from_attributes = True

class OrgUserResponse(BaseModel):
    user_id: int
    name: str
    email: str
    org_id: str
    org_name: str
    
    class Config:
        from_attributes = True

class Document(BaseModel):
    doc_id: Optional[int] = None
    doc_name: str

class DocumentResponse(BaseModel):
    doc_id: int
    # document_uuid: str
    doc_name: str
    folder_id: Optional[int] = None
    doc_url: Optional[str] = None
    doc_status: Optional[str] = None
    task_id: Optional[str] = None
    # sanitized_name: Optional[str] = None
    doc_metadata: Optional[dict] = None
    class Config:
        from_attributes = True
# Schema for handling a list of documents
class DocumentListResponse(BaseModel):
    status: str
    message: str
    data: List[DocumentResponse]

    class Config:
        from_attributes = True

class FolderResponse(BaseModel):
    folder_id: int
    name: str
    shared: str
    documents: List[DocumentResponse] = []

    class Config:
        from_attributes = True

# Schema for handling a list of folders
class FolderListResponse(BaseModel):
    status: str
    message: str
    data: List[FolderResponse]

    class Config:
        from_attributes = True

class FolderCreate(BaseModel):
    folder_name: str
    parent_id: int = None
    shared: str
    # Optional: Validate specific fields
    @validator("folder_name")
    def validate_folder_name(cls, value):
        if any(char in value for char in "\[]}{\\$&%#@)()+!^."):
            # raise ValueError("Folder name contains characters only.")
            raise HTTPException(
                status_code=400,
                detail="Folder name contains characters only."
            )
        return value

class ChatHistoryResponse(BaseModel):
    chat_history_id: int
    user_id: int
    doc_id: int
    document_uuid: str
    query: str
    search_results: str
    citation: str
    query_prompt: str
    query_response: str
    class Config:
        from_attributes = True

class SharedFolder(BaseModel):
    email: str
    folder_id: int
    organization: Optional[str] = None
    access: Optional[str] = None

class SharedFolderResponse(BaseModel):
    email: str
    folder_id: int
    organization: Optional[str] = None

    class Config:
        from_attributes = True

class CustomResponse(BaseModel):
    status: str
    message: str
    data: Optional[Any]

    class Config:
        from_attributes = True