
    (8i>                     `   d dl mZmZmZ d dlmZmZ d dlmZmZ  ede      Z	 G d de      Z
 G d d	e      Z G d
 de      Z	 ddddddedz  dedz  dedz  dedz  deeef   f
dZ	 dddddedededz  dedz  dedz  deeef   fdZdee	   dede	fdZdee	   dedeeef   fdZy)    )AnyTypeTypeVar)	BaseModelField)datetimetimezoneSchemaT)boundc                   n    e Zd ZU  edd      Zeed<    edd      Zeed<    edd      Ze	dz  ed	<   y)
Error.u?   Código de erro categórico (ex.: VALIDATION_ERROR, AUTH_ERROR)descriptioncodezMensagem resumida do erromessageNzDetalhes adicionais do errodetails)
__name__
__module____qualname__r   r   str__annotations__r   r   r        )/srv/www/app-alerta/core/api_responses.pyr   r      s<    c'hiD#i*EFGSF2OPGS4ZPr   r   c                   n    e Zd ZU  edd      Zeed<    edd      Zedz  ed<    edd      Z	eed	<   y)
ErrorResponse.u    Objeto com informações do error   errorN+   Identificador da requisição para rastreio	requestIdu(   Timestamp ISO8601 da ocorrência do erro	timestamp)
r   r   r   r   r   r   r   r   r   r    r   r   r   r   r      s<    *LME5M!$4abIsTzb3,VWIsWr   r   c                       e Zd ZU  edd      Zedz  ed<    edd      Zedz  ed<    edd      Z	edz  ed<    ed	d
      Z
eed<   y)SuccessResponseNu$   Mensagem amigável sobre o resultador   r   u)   Carga útil com o resultado da operaçãodatar   r   .z"Timestamp ISO8601 do processamentor    )r   r   r   r   r   r   r   r#   r   r   r    r   r   r   r"   r"      sV    2XYGS4ZYT/Z[D#*[!$4abIsTzb3,PQIsQr   r"   N)r   
request_idtimestamp_isor#   r   r$   r%   returnc                    |xs1 t        j                  t        j                        j	                         }t        || ||      j                  dd      S )u   
    Constrói um payload de sucesso padronizado para respostas de API.
    - `data`: carga útil da resposta.
    - `message`: mensagem amigável.
    - `request_id`: identificador da requisição.
    - `timestamp_iso`: timestamp opcional (ISO8601).
    )r   r#   r   r    Tby_aliasexclude_unset)r   nowr	   utc	isoformatr"   
model_dump)r#   r   r$   r%   tss        r   build_success_payloadr0      sM     
	@(,,x||4>>@B	
 j$dj34r   )r$   r%   r   r   c                    |xs1 t        j                  t        j                        j	                         }t        | ||      }t        |||      j                  dd      S )u-  
    Constrói um payload de erro padronizado para respostas de API.
    - `code`: código do erro (ex.: VALIDATION_ERROR)
    - `message`: mensagem resumida
    - `details`: detalhes adicionais
    - `request_id`: identificador da requisição
    - `timestamp_iso`: timestamp opcional (ISO8601)
    )r   r   r   )r   r   r    Tr(   )r   r+   r	   r,   r-   r   r   r.   )r   r   r   r$   r%   r/   r   s          r   build_error_payloadr2   .   sX      
	@(,,x||4>>@BtWg>E j$dj3	4r   
schema_clsobjc                    ddl }|j                  t              }t        |t              r		  | di |S t        | dd      }t        |      r		  ||      S t        | dd      }t        |      r		  ||      S t        |dd      }t        |t              r>|j                         D 	ci c]  \  }}	|j                  d	      r||	 }
}}		  | di |
S 	  | di |xs i S # t
        $ r}|j                  d|         d}~ww xY w# t
        $ r}|j                  d|        Y d}~d}~ww xY w# t
        $ r}|j                  d|        Y d}~d}~ww xY wc c}	}w # t
        $ rE}|j                  d
| j                   d| dt        |
j                               dd  d        d}~ww xY w# t
        $ r}|j                  d|         d}~ww xY w)z
    Converte um objeto ORM ou dict para o schema Pydantic correspondente.
    Funciona para:
        - dict
        - ORM com from_attributes=True
        - objetos normais (usa __dict__)
    r   Nz$Erro ao converter dict para schema: model_validateu1   model_validate falhou, tentando outros métodos: from_ormz$from_orm falhou, tentando __dict__: __dict___sa_z%Erro ao converter objeto para schema z
:
  Erro: u0   
  Campos problemáticos podem estar nos dados: 
   z...z'Erro ao criar schema com dados vazios: r   )logging	getLoggerr   
isinstancedict	Exceptionr   getattrcallabledebugitems
startswithlistkeys)r3   r4   r;   loggerer6   r7   r#   kvcleaneds              r   	to_schemarL   G   s    x(F#t	$$$
 Z)94@N	R!#&& z:t4H	EC=  3
D)D$$(JJLMDAqV8L1a4MM	((((SYB((A  	LL?sCD	  	RLLLQCPQQ	R  	ELL?sCDD	E
 N  	LL7
8K8K7L M# BBFw||~BVWZXZB[A\\_a
 	  >qcBCs   C D -D- %E?EE F. 	D &C;;D 	D*D%%D*-	E6EE	F+&A F&&F+.	G7GGc                 @    t        | |      }|j                  dd      S )z
    Converte um objeto para schema Pydantic e retorna como dict pronto para API.
    Usa `by_alias=True` e `exclude_unset=True` para manter os aliases corretos.
    Tr(   )rL   r.   )r3   r4   instances      r   to_schema_dictrO   z   s&    
 S)HDAAr   )N)typingr   r   r   pydanticr   r   r   r	   r
   r   r   r"   r   r>   r0   r2   rL   rO   r   r   r   <module>rR      sU   % % % '
)9
-QI Q
XI X
Ri R 4 ! $4
*4 4Z4 d
	4
 :4 
#s(^44 4
 " $4
44 4Z4
 d
4 :4 
#s(^421$w- 1c 1g 1fBtG} B3 B4S> Br   