from pydantic import BaseModel, EmailStr, field_validator, ConfigDict
from datetime import datetime
import re


class SubmissionBase(BaseModel):
    name: str
    email: str


class SubmissionCreate(SubmissionBase):
    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Name field is required and must not be empty")
        if len(v) > 100:
            raise ValueError("Name field maximum length is 100 characters")
        return v

    @field_validator("email")
    @classmethod
    def validate_email(cls, v: str) -> str:
        if not v or not v.strip():
            raise ValueError("Email field is required and must not be empty")
        if len(v) > 255:
            raise ValueError("Email field maximum length is 255 characters")
        email_pattern = r"^[^\s@]+@[^\s@]+\.[^\s@]+$"
        if not re.match(email_pattern, v):
            raise ValueError("Email field must contain valid email format")
        return v


class SubmissionUpdate(BaseModel):
    name: str | None = None
    email: str | None = None

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str | None) -> str | None:
        if v is not None:
            if not v or not v.strip():
                raise ValueError("Name field is required and must not be empty")
            if len(v) > 100:
                raise ValueError("Name field maximum length is 100 characters")
        return v

    @field_validator("email")
    @classmethod
    def validate_email(cls, v: str | None) -> str | None:
        if v is not None:
            if not v or not v.strip():
                raise ValueError("Email field is required and must not be empty")
            if len(v) > 255:
                raise ValueError("Email field maximum length is 255 characters")
            email_pattern = r"^[^\s@]+@[^\s@]+\.[^\s@]+$"
            if not re.match(email_pattern, v):
                raise ValueError("Email field must contain valid email format")
        return v


class SubmissionResponse(SubmissionBase):
    id: str
    created_at: datetime
    updated_at: datetime

    model_config = ConfigDict(from_attributes=True)