
    ]i\                        d Z ddlmZ ddlmZmZmZmZ ddlmZm	Z	m
Z
mZ ddlmZ  G d dee      Z G d d	ee      Z G d
 dee      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d de      Z G d  d!e      Z G d" d#e      Z G d$ d%e      Zy&)'za
Genesis Talking Website Widget - Pydantic Models
Request/response schemas for all API endpoints
    )datetime)OptionalListDictAny)	BaseModelFieldEmailStr	validator)Enumc                       e Zd ZdZdZdZy)ConversationModez#How the conversation was conducted.voicetextN)__name__
__module____qualname____doc__VOICETEXT     2/mnt/e/genesis-system/RECEPTIONISTAI/api/models.pyr   r      s    -EDr   r   c                   $    e Zd ZdZdZdZdZdZdZy)
LeadStatusz!Status of a lead in the pipeline.new	contacted	qualified	convertedlostN)	r   r   r   r   NEW	CONTACTED	QUALIFIED	CONVERTEDLOSTr   r   r   r   r      s    +
CIIIDr   r   c                        e Zd ZdZdZdZdZdZy)WidgetPositionzPosition of widget on website.bottom-rightzbottom-leftz	top-rightztop-leftN)r   r   r   r   BOTTOM_RIGHTBOTTOM_LEFT	TOP_RIGHTTOP_LEFTr   r   r   r'   r'      s    (!LKIHr   r'   c                       e Zd ZU dZ edd      Zeed<    edd      Zeed<    edd      Z	eed	<    ei d
      Z
eeeef      ed<    G d d      Zy)ConversationRequestz*Request for voice conversation processing..zBusiness identifierdescriptionbusiness_idzUnique visitor session ID
visitor_idz!Base64 encoded audio from visitor
audio_datazSession state)defaultr0   session_contextc                   $    e Zd ZddddddddiZy	)
ConversationRequest.Configexample
bus_abc123
vis_xyz789zbase64EncodedAudioData.../pricinggoogle)pagereferrer)r1   r2   r3   r5   Nr   r   r   json_schema_extrar   r   r   Configr7   ,   s#    +*9,6H#M	
r   rA   N)r   r   r   r   r	   r1   str__annotations__r2   r3   r5   r   r   r   rA   r   r   r   r.   r.   %   sc    4S.CDKDC-HIJIC-PQJQ05bo0^OXd38n-^
 
r   r.   c                   r    e Zd ZU dZeed<   eed<    eddd      Zeed<    ei 	      Ze	e
eef      ed
<   y)TextConversationRequestz.Request for text-only conversation (fallback).r1   r2   .     
min_length
max_lengthmessager4   r5   N)r   r   r   r   rB   rC   r	   rK   r5   r   r   r   r   r   r   rE   rE   7   s?    8Ot<GS<05b0AOXd38n-Ar   rE   c                       e Zd ZU dZeed<   eed<    edd      Zee   ed<    edd      Z	ee   ed	<   dZ
ee   ed
<    edd      Zee   ed<   dZee   ed<    ed	d
      d        Zy)LeadCaptureRequestz"Request to store lead information.r1   r2   N   )rJ   name2   phoneemailrG   notesconversation_idc                 J    d|v r|j                  d      s|st        d      |S )z+Ensure at least phone or email is provided.rR   z5At least one contact method (phone or email) required)get
ValueError)clsvvaluess      r   at_least_one_contactz'LeadCaptureRequest.at_least_one_contactI   s*     fVZZ%8TUUr   )r   r   r   r   rB   rC   r	   rP   r   rR   rS   r
   rT   rU   r   r\   r   r   r   rN   rN   ?   s    ,O5D(3-5 "5E8C=5 $E8H$ $7E8C=7%)OXc])w  !r   rN   c                       e Zd ZU dZ eddd      Zeed<   dZe	e   ed<    ed	d
      Z
eed<    edd      Zeed<    edd      Zeed<    ei       Ze	eeef      ed<   y)BusinessCreateRequestz.Request to create a new business (admin only)..   rO   rH   rP   Nwebsite_urlz6Hi! Thanks for reaching out. How can I help you today?i  )r4   rJ   greeting_messageSarahd   
agent_name#6366F1z^#[0-9A-Fa-f]{6}$)r4   patternprimary_colorrL   knowledge_base)r   r   r   r   r	   rP   rB   rC   r`   r   ra   rd   rg   rh   r   r   r   r   r   r^   r^   Q   s    8caC8D#8!%K#%!Hc  G<J<y:NOM3O/4R/@NHT#s(^,@r   r^   c                       e Zd ZU dZeed<    edd      Zeed<    edd      Zeed<    ei 	      Z	e
eef   ed
<    ed	      Zeed<    G d d      Zy)ConversationResponsez&Response from conversation processing.rU   .zBase64 encoded audio responser/   audio_responsezText transcript of AI response
transcriptrL   r5   Flead_capturedc                   &    e Zd Zddddddddd	iZy
)ConversationResponse.Configr8   conv_123abczbase64EncodedAudioResponse...z/I'd be happy to help you book an appointment...bookingr_   )intentstepF)rU   rk   rl   r5   rm   Nr?   r   r   r   rA   ro   h   s&    #0"AO.7#C!&
r   rA   N)r   r   r   r   rB   rC   r	   rk   rl   r5   r   r   rm   boolrA   r   r   r   rj   rj   `   s_    01PQNCQC-MNJN&+B&7OT#s(^7.M4.	
 	
r   rj   c                   h    e Zd ZU dZeed<   eed<    ei       Zeee	f   ed<    ed      Z
eed<   y)	TextConversationResponsez Response from text conversation.rU   rK   rL   r5   Frm   N)r   r   r   r   rB   rC   r	   r5   r   r   rm   rt   r   r   r   rv   rv   t   s6    *L&+B&7OT#s(^7.M4.r   rv   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   ej                  Zeed<   dZ	e
e   ed	<    G d
 d      Zy)WidgetConfigz.Configuration for widget display and behavior.r1   business_namerd   ra   rg   positionN
avatar_urlc            	       $    e Zd Zddddddddd	iZy)
WidgetConfig.Configr8   r9   zAcme Plumbingrb   z-Hi! Thanks for reaching out to Acme Plumbing.re   r(   N)r1   ry   rd   ra   rg   rz   r{   r?   r   r   r   rA   r}      s'    +!0%$S!**"

r   rA   )r   r   r   r   rB   rC   r'   r)   rz   r{   r   rA   r   r   r   rx   rx   |   sJ    8O-::Hn: $J$
 
r   rx   c                       e Zd ZU dZeed<   eed<   eed<   ee   ed<   ee   ed<   ee   ed<   ee   ed<   eed	<   ee   ed
<   eed<   eed<    G d d      Z	y)LeadzLead information.idr1   r2   rP   rR   rS   rT   statusrU   
created_at
updated_atc                       e Zd ZdZy)Lead.ConfigTNr   r   r   from_attributesr   r   r   rA   r          r   rA   N)
r   r   r   r   rB   rC   r   r   r   rA   r   r   r   r   r      sc    GO
3-C=C=C=c]" r   r   c                   @    e Zd ZU dZee   ed<   eed<   eed<   eed<   y)LeadListResponsezList of leads for a business.leadstotalr=   	page_sizeN)r   r   r   r   r   r   rC   intr   r   r   r   r      s    ':J
INr   r   c                       e Zd ZU dZeed<   eed<   eed<   eed<    edd      Ze	ed	<    edd
      Z
e	ed<   eed<   eed<   eeeef      ed<    G d d      Zy)AnalyticsResponsezAnalytics for a business.r1   periodtotal_conversationstotal_leads.z/Percentage of conversations that captured leadsr/   conversion_ratezAverage duration in secondsavg_conversation_durationvoice_conversationstext_conversations	top_pagesc                   8    e Zd Zddddddddd	d
dddddgd	iZy)AnalyticsResponse.Configr8   r9   last_30_days   &   g333333:@g     @E@      r;   4   )r=   conversationsz	/services   )	r1   r   r   r   r   r   r   r   r   Nr?   r   r   r   rA   r      s?    +('*!#'-1'*&('"=(2>
r   rA   N)r   r   r   r   rB   rC   r   r	   r   floatr   r   r   r   rA   r   r   r   r   r      sj    #K"34efOUf',S>['\u\DcN##
 
r   r   c                       e Zd ZU dZeed<   eed<    edd      Zeed<   ee   ed<   e	ee
f   ed	<   eed
<   eed<    G d d      Zy)BusinesszBusiness entity.r   rP   .z!API key for widget authenticationr/   api_keyr`   configr   r   c                       e Zd ZdZy)Business.ConfigTNr   r   r   r   rA   r      r   r   rA   N)r   r   r   r   rB   rC   r	   r   r   r   r   r   rA   r   r   r   r   r      sO    G
I*MNGSN#cN r   r   c                   D    e Zd ZU dZeed<   eed<   eeef   ed<   eed<   y)HealthResponsezHealth check response.r   versionservices	timestampN)r   r   r   r   rB   rC   r   r   r   r   r   r   r      s#     KL38nr   r   c                   D    e Zd ZU dZeed<   dZee   ed<   dZee   ed<   y)ErrorResponsezStandard error response.errorNdetail
request_id)	r   r   r   r   rB   rC   r   r   r   r   r   r   r   r      s&    "J FHSM  $J$r   r   N)r   r   typingr   r   r   r   pydanticr   r	   r
   r   enumr   rB   r   r   r'   r.   rE   rN   r^   rj   rv   rx   r   r   r   r   r   r   r   r   r   <module>r      s   
  , , : : sD d S$ 
) 
$Bi B $
AI 
A
9 
(/y /
9 
09 $y 
	 
>y Y %I %r   