""" Provider (szolgáltató) Pydantic sémák a crowdsourced partnerkeresőhöz. Tartalmazza a keresési, gyors felvételi és szerkesztési sémákat. P1 CRITICAL ALIGN (2026-06-17): Atomizált címmezők bevezetése. - street -> address_street_name, address_street_type, address_house_number - A ProviderSearchResult is tartalmazza az atomizált címmezőket. """ from pydantic import BaseModel, Field, ConfigDict from typing import Optional, List class ExpertiseCategoryOut(BaseModel): """Expertise kategória kimeneti sémája a frontend dropdown számára.""" id: int key: str name_hu: Optional[str] = None name_en: Optional[str] = None category: str model_config = ConfigDict(from_attributes=True) class ProviderSearchResult(BaseModel): """Egy szolgáltató keresési találatának adatai. P1 CRITICAL ALIGN (2026-06-17): Atomizált címmezők. - address_street_name, address_street_type, address_house_number - A frontend ezeket intelligensen fűzi össze megjelenítéskor. """ id: int name: str category: Optional[str] = None specialization: List[str] = Field(default_factory=list) city: Optional[str] = None address: Optional[str] = None address_zip: Optional[str] = None address_street_name: Optional[str] = None address_street_type: Optional[str] = None address_house_number: Optional[str] = None contact_phone: Optional[str] = None contact_email: Optional[str] = None website: Optional[str] = None tags: List[str] = Field(default_factory=list) source: str = Field(..., description="Forrás: verified_org | staged_data | crowd_added") is_verified: bool = False rating: Optional[float] = None model_config = ConfigDict(from_attributes=True) class ProviderSearchResponse(BaseModel): """Keresési eredmények lapozással.""" results: List[ProviderSearchResult] = Field(default_factory=list) total: int = 0 page: int = 1 per_page: int = 20 class ProviderQuickAddIn(BaseModel): """Gyors szolgáltató felvétel bemeneti adatai. P1 CRITICAL ALIGN (2026-06-17): Atomizált címmezők. - street ELTÁVOLÍTVA, helyette address_street_name, address_street_type, address_house_number """ name: str = Field(..., min_length=2, max_length=200, description="Szolgáltató neve") category_id: int = Field(..., ge=1, description="Kategória ID (marketplace.expertise_tags.id)") city: Optional[str] = Field(None, max_length=100, description="Város") address_zip: Optional[str] = Field(None, max_length=20, description="Irányítószám") address_street_name: Optional[str] = Field(None, max_length=150, description="Utca neve (pl. Egressy)") address_street_type: Optional[str] = Field(None, max_length=50, description="Közterület jellege (pl. utca, út, tér)") address_house_number: Optional[str] = Field(None, max_length=20, description="Házszám (pl. 4/b)") contact_phone: Optional[str] = Field(None, max_length=50, description="Telefonszám") contact_email: Optional[str] = Field(None, max_length=255, description="Email cím") website: Optional[str] = Field(None, max_length=255, description="Weboldal URL") tags: Optional[List[str]] = Field(None, description="Szolgáltatás címkék (specialization_tags)") class ProviderQuickAddResponse(BaseModel): """Gyors szolgáltató felvétel válasza.""" id: int name: str status: str = "pending_verification" message: str = "Szolgáltató sikeresen rögzítve. Ellenőrzés alatt." earned_points: int = 0 class ProviderUpdateIn(BaseModel): """Szolgáltató adatainak szerkesztése (PUT /providers/{id}). P1 CRITICAL ALIGN (2026-06-17): Atomizált címmezők. - street ELTÁVOLÍTVA, helyette address_street_name, address_street_type, address_house_number - Tartalmazza a contact_phone, contact_email, website és tags mezőket is. """ name: str = Field(..., min_length=2, max_length=200, description="Szolgáltató neve") city: Optional[str] = Field(None, max_length=100, description="Város") address_zip: Optional[str] = Field(None, max_length=20, description="Irányítószám") address_street_name: Optional[str] = Field(None, max_length=150, description="Utca neve (pl. Egressy)") address_street_type: Optional[str] = Field(None, max_length=50, description="Közterület jellege (pl. utca, út, tér)") address_house_number: Optional[str] = Field(None, max_length=20, description="Házszám (pl. 4/b)") contact_phone: Optional[str] = Field(None, max_length=50, description="Telefonszám") contact_email: Optional[str] = Field(None, max_length=255, description="Email cím") website: Optional[str] = Field(None, max_length=255, description="Weboldal URL") tags: Optional[List[str]] = Field(None, description="Szolgáltatás címkék (specialization_tags)") class ProviderUpdateResponse(BaseModel): """Szolgáltató szerkesztés válasza.""" id: int name: str message: str = "Szolgáltató adatai sikeresen frissítve."