from typing import Optional
from pydantic import Field, ConfigDict
from src.core.utils.enums import FileTypes
from datetime import datetime
from src.apps.base.schemas.common import BaseSchema


class FileBase(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    original_name: Optional[str] = Field(default=None, description="Original Name of file")
    name: Optional[str] = Field(default=None, description="Generated Name of file")
    path: Optional[str] = Field(default=None, description="Upload path of file")
    file_type: Optional[FileTypes] = Field(default=None, description="Type of file")
    mime: Optional[str] = Field(default=None, description="MIME type of file")
    cdn_id: Optional[str] = Field(default=None, description="CDN location of file")


class FileSchema(FileBase):
    model_config = ConfigDict(from_attributes=True)
    
    id: Optional[int] = Field(default=None, description="Id of Line Item resource")
    created_at: Optional[datetime] = Field(
        default=None,
        description="Created date and time of file as unix timestamp"
    )
    full_url: Optional[str] = Field(default=None, description="Server URL of the uploaded file")
    filesize: Optional[str] = Field(default=None, description="Size of file in mb")
    generation_type: Optional[str] = Field(
        default="file", description="Generation type of file"
    )
    byte_content: Optional[bytes] = Field(default=None, description="Content of file")


class FileResponseSchema(BaseSchema):
    model_config = ConfigDict(from_attributes=True)
    
    id: int = Field(description="Id of Line Item resource")
    original_name: Optional[str] = Field(default=None, description="Original Name of file")
    name: Optional[str] = Field(default=None, description="Generated Name of file")
    file_type: Optional[FileTypes] = Field(default=None, description="Type of file")
    mime: Optional[str] = Field(default=None, description="MIME type of file")
    full_url: Optional[str] = Field(default=None, description="Server URL of the uploaded file")
    filesize: Optional[str] = Field(default=None, description="Size of file in mb")
    created_at: datetime = Field(
        description="Created date and time of file as unix timestamp"
    )
