
    } i3                        U d dl mZmZmZmZ d dlmZmZmZ d dl	m
Z
 d dlmZ d dlmZ d dlmZmZmZ d dlmZ d dlmZ d d	lmZ d d
lZd dlmZ d d	lmZ d d
lZ e         ed      Zd Zd 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# edd      Z$ e       Z% ejL                  d      Z' ejL                  d       Z(d
a)e
e*d!<   d
a+ee*d"<   e$jY                  d#      d$        Z-e$jY                  d%      d&        Z.d'e/fd(Z0e%jc                  d)e"ejd                  d*g+      d,efd-       Z3e%ji                  d.ee"   d*g/      d0        Z5e%ji                  d1e"d*g/      d2e/fd3       Z6e%jo                  d1ejp                  d*g4      d2e/fd5       Z9e%jc                  d6e#ejd                  d7g+      d8e#fd9       Z:e%ji                  d6ee#   d7g/      d:        Z;e%ji                  d;e#d7g/      d<e/fd=       Z< G d> d?e      Z=e%j}                  d@e#d7g/      d,e=fdA       Z?e$j                  e%dBgC       eAdDk(  r ej                  e$dEdFG       y
y
)H    )FastAPIHTTPExceptionstatus	APIRouter)ListAnyOptional)MongoClient)ObjectId)load_dotenv)	BaseModelField
ConfigDict)ServerSelectionTimeoutError)datetime)ZoneInfoNzAmerica/Guayaquilc                      t        j                  t              } | j                  d      j	                  dd      j                         S )Nz%A %#d de %b de %Y. )r   now
ECUADOR_TZstrftimereplace
capitalizer   s    '/opt/movilizia/ApiFast/api_movilizia.py#get_current_date_in_format_day_onlyr      s6    
,,z
"C<<,-55c2>IIKK    c                  V    t        j                  t              } | j                  d      S )Nz%H:%M)r   r   r   r   r   s    r   $get_current_time_in_format_hour_onlyr       s    
,,z
"C<<  r   c                   "    e Zd ZU eed<   eed<   y)MCPTransportistawhatsappnombreN)__name__
__module____qualname__str__annotations__ r   r   r"   r"      s    MKr   r"   c                   "    e Zd ZU eed<   eed<   y)MCPVehiculoplacacarga_maximaN)r%   r&   r'   r(   r)   floatr*   r   r   r,   r,   "   s    Jr   r,   c                   "    e Zd ZU eed<   eed<   y)RegistroTransportistaBodytransportistavehiculoN)r%   r&   r'   r"   r)   r,   r*   r   r   r1   r1   &   s    ##r   r1   c                   L    e Zd ZU  edd      Zeed<    eddd      Zeed<   y	)
Vehiculo.u    Matrícula única del vehículo.descriptionr-   r   u(   Capacidad máxima de carga en toneladas.)gtr7   r.   N)	r%   r&   r'   r   r-   r(   r)   r.   r/   r*   r   r   r5   r5   *   s(    s(JKE3K7abL%br   r5   c                   N    e Zd ZU  edd      Zee   ed<    eddddii      Z	y)	MongoBaseModel_idN)aliasdefaultidTexample60d5ec49b14f6b3d4f4d4e3a)populate_by_namejson_schema_extra)
r%   r&   r'   r   r>   r	   r(   r)   r   model_configr*   r   r   r:   r:   .   s2    E48B8$t-G&HILr   r:   c                   n    e Zd ZU  edd      Zeed<    edd      Zeed<    eed      Z	e
e   ed	<   y
)Transportista.z"Nombre completo del transportista.r6   r$   u)   Número de contacto principal (whatsapp).telefono_whatsappu   Lista de vehículos asociados.)default_factoryr7   	vehiculosN)r%   r&   r'   r   r$   r(   r)   rF   listrH   r   r5   r*   r   r   rE   rE   5   s=    )MNFCN"34_`s` %dHh iItH~ir   rE   c                       e Zd ZU eed<   eed<    edd      Zeed<    edd      Zee	   ed	<   eed
<   eed<   dZ
eed<    ee      Zeed<    ee      Zeed<   y)OrdenDeServiciowhatsappClientenombreCliente.u#   Descripción detallada de la carga.r6   cargaNzPeso estimado de la carga.peso_aproximadoorigendestino	pendienteestado)rG   fechahora)r%   r&   r'   r(   r)   r   rN   rO   r	   r/   rS   r   rT   r    rU   r*   r   r   rK   rK   :   sj    s(MNE3N',T?['\OXe_\KLFC'JKE3K&JKD#Kr   rK   zAPI MOVILIZIAz/api-movilizia)title	root_path	MONGO_URIMONGO_DB_NAMEclientdbstartupc                  *   t         rt        st        d      	 t        t         d      at        j
                  j                  d       t        t           at        dt                y # t        t        f$ r} t        d|         d aY d } ~ y d } ~ ww xY w)Nz0MONGO_URI y MONGO_DB_NAME deben estar definidos.i  )serverSelectionTimeoutMSpingzConectado a MongoDB: z!ERROR FATAL AL CONECTAR A MONGO: )rX   rY   
ValueErrorr
   rZ   admincommandr[   printr   	Exception)es    r   startup_db_clientrf   Q   s|     MKLLYFV$M"%m_56'3 1!56s   AA) )B8BBshutdownc                  P    t         r t         j                          t        d       y y )Nu   Conexión a MongoDB cerrada.)rZ   closerc   r*   r   r   shutdown_db_clientrj   `   s     ,- r   r>   c                 N    	 t        |       S # t        $ r t        dd      w xY w)N  u   ID inválidostatus_codedetail)r   rd   r   )r>   s    r   validate_object_idrp   h   s0    D| DNCCDs   
 $z/transportistas/registerTransportistas)response_modelrn   tagsrequest_bodyc                    t         t        t        j                  d      t	        | j
                  j                  | j
                  j                  t        | j                  j                  | j                  j                        g      }|j                  dd      }d|v r|j                  d       	 t         j                  j                  |      }t         j                  j%                  d
|j&                  i      }|r"|j)                  d
      rt+        |d
         |d
<   t        j-                  |d      S # t         $ r#}t        t        j"                  d	|       d}~ww xY w)u)   Registra un Transportista y su Vehículo.Nz!Error al registrar: DB no activa.rm   )r-   r.   )r$   rF   rH   Tby_aliasexclude_noner>   
Error DB: r;   from_attributes)r[   r   r   HTTP_503_SERVICE_UNAVAILABLErE   r2   r$   r#   r5   r3   r-   r.   
model_dumppoptransportistas
insert_onerd   HTTP_500_INTERNAL_SERVER_ERRORfind_oneinserted_idgetr(   model_validate)rt   nuevo_transportistadata_to_insertresultre   createds         r   *register_transportista_and_vehicle_unifiedr   r   s?    
z(K(KTwxx'))00&44==<0066\EZEZEgEgh
 )33TPT3UN~~11$7h""--n= ((%1C1C)DEG7;;u%GEN8Kwu~'''FF  h(M(MXbcdbeVfgghs   5D: :	E&E!!E&z/transportistas/)rr   rs   c                     t         t        t        j                  d      	 t         j                  j                         } g }| D ]J  }|j                  d      rt        |d         |d<   |j                  t        j                  |d             L |S # t        $ r#}t        t        j                  d|       d}~ww xY w)zLee todos los transportistas.NError al listar: DB no activa.rm   r;   Trz   ry   )r[   r   r   r|   r   findr   r(   appendrE   r   rd   r   resultsvalidated_resultsdocre   s       r   read_transportistasr      s     
z(K(KTtuuh##((* 	^Cwwu~CE
Os5z$$]%A%A#W[%A%\]	^ !  h(M(MXbcdbeVfggh   A0B 	C B;;C z/transportistas/{whatsapp}r#   c                 v   t         t        t        j                  d      	 t         j                  j                  d| i      }|st        dd|        t        |d         |d<   t        j                  |d	      S # t        $ r}|d}~wt        $ r#}t        t        j                  d
|       d}~ww xY w)u2   Busca un transportista por su número de WhatsApp.NError: DB no activa.rm   rF     +   No se encontró transportista con WhatsApp r;   Trz   ry   )r[   r   r   r|   r   r   r(   rE   r   rd   HTTP_400_BAD_REQUEST)r#   r2   re   s      r   get_transportista_by_whatsappr      s     
z;;)
 	


))224G3RSDXJO 
  #=#78e++M4+PP  
33s#
 	

s$   AA> >	B8B		B8B33B8)rn   rs   c                 4   t         t        t        j                  d      	 t         j                  j                  d| i      }|j                  dk(  rt        dd|        dd	|  d
iS # t        $ r#}t        t        j                  d|       d}~ww xY w)u4   Elimina un transportista por su número de WhatsApp.Nr   rm   rF   r   r   r   messagezTransportista con WhatsApp z eliminado correctamente.ry   )	r[   r   r   r|   r   
delete_onedeleted_countrd   r   )r#   r   re   s      r    delete_transportista_by_whatsappr      s     
z(K(KTjkkh""--/BH.MN1$C:efneo8pqq8
B[\]] h(M(MXbcdbeVfgghs   AA+ +	B4BBz	/ordenes/u   Órdenes de Servicio
orden_datac                    t         t        t        j                  d      | j	                  dd      }d|v r|j                  d       	 t         j                  j                  |      }t         j                  j                  d|j                  i      }|r"|j                  d      rt        |d         |d<   t        j                  |d	      S # t        $ r#}t        t        j                  d|       d}~ww xY w)
z!Crea una nueva orden de servicio.NzError al crear: DB no activa.rm   Trv   r>   zError al crear orden en la DB: r;   rz   )r[   r   r   r|   r}   r~   ordenesr   rd   r   r   r   r   r(   rK   r   )r   datar   re   r   s        r   create_ordenr      s     
z(K(KTstt  $T BDt|TXXd^}&&t, jj!!5&*<*<"=>G7;;u%GEN8Kwu~))'4)HH  }(M(MXwxywzV{||}s   C 	C<C77C<c                     t         t        t        j                  d      	 t         j                  j                         } g }| D ]J  }|j                  d      rt        |d         |d<   |j                  t        j                  |d             L |S # t        $ r#}t        t        j                  d|       d}~ww xY w)u#   Lee todas las órdenes de servicio.Nr   rm   r;   Trz   u   Error al listar órdenes: )r[   r   r   r|   r   r   r   r(   r   rK   r   rd   r   r   s       r   read_ordenesr      s     
z(K(KTtuux**//# 	`Cwwu~CE
Os5z$$_%C%CCY]%C%^_	` !  x(M(MXrstruVvwwxr   z/ordenes/{orden_id}orden_idc                    t         t        t        j                  d      t	        |       }t         j
                  j                  d|i      }|st        dd|        t        |d         |d<   t        j                  |d      S )zBusca una orden por su ID.DB no activa.rm   r;   r       No se encontró la orden con ID Trz   )
r[   r   r   r|   rp   r   r   r(   rK   r   )r   obj_idordens      r   get_orden_by_idr     s     
z(K(KTcdd)FJJ0E6VW_V`4abbuU|$E%L))%)FFr   c                   T    e Zd ZU eed<   dZee   ed<   dZee   ed<   dZee   ed<   y)UpdateOrdenTransportistaBodyr>   Nnuevo_estadowhatsapp_transportistanombre_transportista)	r%   r&   r'   r(   r)   r   r	   r   r   r*   r   r   r   r     s3    G"&L(3-&,0HSM0*.(3-.r   r   z/ordenes/actualizarc                    t         t        t        j                  d      t	        | j
                        }	 t         j                  j                  d|i      }|st        dd| j
                         i }| j                  r| j                  |d<   | j                  r| j                  |d<   | j                  r| j                  |d	<   |r$t         j                  j                  d|id
|i       t         j                  j                  d|i      }|r"|j                  d      rt        |d         |d<   t        j                  |d      S # t        $ r}|d}~wt         $ r}t        dd|       d}~ww xY w)zHActualiza el estado de la orden y los datos del transportista asociados.Nr   rm   r;   r   r   rS   r   r   z$setTrz   rl   zError al actualizar la orden: )r[   r   r   r|   rp   r>   r   r   r   r   r   
update_oner   r(   rK   r   rd   )rt   r   r   update_dataorden_actualizadare   s         r   update_orden_y_transportistar     sl    
z(K(KTcdd0FZ

##UFO4C:Z[g[j[jZk8lmm$$$0$=$=K!..4@4W4WK01,,2>2S2SK./JJ!!5&/FK3HI JJ//@!2!6!6u!='*+<U+C'De$--.?QU-VV  Z6TUVTW4XYYZs$   DE
 
	E6EE6!E11E6zTransporte Rural)rs   __main__z0.0.0.0iB  )hostport)Cfastapir   r   r   r   typingr   r   r	   pymongor
   bson.objectidr   dotenvr   pydanticr   r   r   pymongo.errorsr   r   zoneinfor   osuvicornr   r   r    r"   r,   r1   r5   r:   rE   rK   approutergetenvrX   rY   rZ   r)   r[   on_eventrf   rj   r(   rp   postHTTP_201_CREATEDr   r   r   r   deleteHTTP_200_OKr   r   r   r   r   patchr   include_routerr%   runr*   r   r   <module>r      s8   = = & &  "  1 1 6   	     )*
L!
y ) 	 cy cY jN j
	Ln 	L O/?@	BIIk"			/* 
Ci  j. .D3 D  ''
		  G=V GG4 tM/BJZI[\h ]h" (N^M_`
C 
 a
D +9K9KScRdehs h fh& V=T=T\r[s  I_ II$ K_(=E[D\]x ^x  !/I_H`aGc G bG"/9 / #OKaJbc#Z/K #Z d#ZV   6!3 4  5 zGKK r   