from datetime import datetime
from pydantic import BaseModel, Field
from fastapi import Form

from typing import Optional

from pydantic import Field

from src.apps.base.schemas.common import BaseSchema

class FileBaseSchema(BaseModel):
    """
    Base schema for File.
    Shared fields used by create/update schemas.
    """

    original_name: str = Field(..., example="holiday_photo.jpg")
    name: str = Field(..., example="photo_2025_01.jpg")
    path: str = Field(..., example="uploads/images/photo_2025_01.jpg")
    mime: str | None = Field(None, example="image/jpeg")
    created_by_id: int = Field(..., example=1)


class FileCreateSchema(BaseModel):
    original_name: str
    name: str
    path: str
    mime: str | None
    created_by_id: int

    @classmethod
    def as_form(
        cls,
        original_name: str = Form(..., description="Original file name"),
        name: str = Form(..., description="Stored file name"),
        path: str = Form(..., description="Storage path"),
        mime: str | None = Form(None, description="MIME type"),
        created_by_id: int = Form(..., description="Uploader ID"),
    ):
        return cls(
            original_name=original_name,
            name=name,
            path=path,
            mime=mime,
            created_by_id=created_by_id,
        )



class FileUpdateSchema(BaseModel):
    """
    Schema for updating a File.
    Only allow updating some fields.
    """

    original_name: str | None = Field(None, example="updated_photo.jpg")
    name: str | None = Field(None, example="photo_final_2025.jpg")
    path: str | None = Field(None, example="uploads/images/photo_final_2025.jpg")
    mime: str | None = Field(None, example="image/png")


class FileMinimalSchema(BaseSchema):
    id: int
    path: str

class FileResponseSchema(BaseSchema):
    id: int = Field(..., description="File id")
    original_name: Optional[str] = Field(None, description="Original name of the file")
    path: Optional[str] = Field(None, description="Path to the file")
    name: Optional[str] = Field(None, description="Name of the file")
    mime: Optional[str] = Field(None, description="MIME type of the file")
    full_url: Optional[str] = Field(None, description="Full URL to access the file")
    created_at: Optional[datetime] = Field(None, description="File created at")
    created_by_id: Optional[int] = Field(None, description="file created by")