from __future__ import annotations

from datetime import datetime

from pydantic import ConfigDict, field_validator

from fields.base import ResponseModel
from libs.helper import to_timestamp


class UploadConfig(ResponseModel):
    file_size_limit: int
    batch_count_limit: int
    file_upload_limit: int | None = None
    image_file_size_limit: int
    video_file_size_limit: int
    audio_file_size_limit: int
    workflow_file_upload_limit: int
    image_file_batch_limit: int
    single_chunk_attachment_limit: int
    attachment_image_file_size_limit: int | None = None


class FileResponse(ResponseModel):
    id: str
    name: str
    size: int
    extension: str | None = None
    mime_type: str | None = None
    created_by: str | None = None
    created_at: int | None = None
    preview_url: str | None = None
    source_url: str | None = None
    original_url: str | None = None
    user_id: str | None = None
    tenant_id: str | None = None
    conversation_id: str | None = None
    file_key: str | None = None

    @field_validator("created_at", mode="before")
    @classmethod
    def _normalize_created_at(cls, value: datetime | int | None) -> int | None:
        return to_timestamp(value)


class RemoteFileInfo(ResponseModel):
    file_type: str
    file_length: int


class FileWithSignedUrl(ResponseModel):
    model_config = ConfigDict(json_schema_serialization_defaults_required=True)

    id: str
    name: str
    size: int
    extension: str | None = None
    url: str | None = None
    mime_type: str | None = None
    created_by: str | None = None
    created_at: int | None = None

    @field_validator("created_at", mode="before")
    @classmethod
    def _normalize_created_at(cls, value: datetime | int | None) -> int | None:
        return to_timestamp(value)


__all__ = [
    "FileResponse",
    "FileWithSignedUrl",
    "RemoteFileInfo",
    "UploadConfig",
]
