from datetime import datetime, timezone, timedelta
from typing import Optional
from pydantic import BaseModel, EmailStr, Field, field_validator


class LogEmailRequest(BaseModel):
    sender_name: str = Field(min_length=2, max_length=255)
    sender_email: EmailStr
    email_subject: str = Field(min_length=1, max_length=500)
    email_received_at: datetime
    message: str = Field(min_length=10, max_length=10000)

    @field_validator('email_received_at')
    @classmethod
    def _not_far_future(cls, v: datetime) -> datetime:
        now = datetime.now(timezone.utc)
        if v.tzinfo is None:
            v = v.replace(tzinfo=timezone.utc)
        if v > now + timedelta(minutes=5):
            raise ValueError("email_received_at cannot be more than 5 minutes in the future")
        return v
