
    dh                        d dl m Z mZ d dlmZ d dlmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZmZmZmZmZ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  d dl!m"Z" d dl#m$Z$ d dl%m&Z&m'Z' dede(defdZ)	 	 	 	 ddede(de(de'e*   de&e   f
dZ+dedefdZ,dede(dedefdZ-dede(ddfdZ.d de'e*   fdZ/d Z0y)!    )datetimetimezone)Session)HTTPExceptionstatus)APIException)Region	SubRegion)settings)API_PREFIXES)RegionCreateSchemaRegionUpdateSchemaRegionOutSchemaSubRegionCreateSchemaSubRegionUpdateSchemaSubRegionOutSchemaRegionFilterSchemaSubRegionFilterSchema)get_country_by_id)get_region_by_id)QueryPaginator)Country)UUID)IntegrityError)OptionalListdbsub_region_idreturnc                   K   	 | j                  t              j                  t        j                  |k(  t        j                  j                  d             j                         }|st        dddit        j                  d      |S # t        $ r-}t        ddt        |      it        j                  d      d }~ww xY ww)Nr
   	exceptionzSub-region not foundmoduleerrorstatus_codemessagez Error fetching sub-region by ID.)queryr
   filterid
deleted_atis_firstr   r   HTTP_404_NOT_FOUND	Exceptionstrr   r   
sub_regiones       [/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/base/services/sub_region.pyget_sub_region_by_idr4      s     
XXi(//LLM)  $$T*
 %' 	 ""$:;"55.	   
A'116	
 	

s)   CBB C	B>(B99B>>CNpageper_pagesort_bypayloadc           
        K   	 |dz
  |z  }| j                  t              j                  t        j                  j	                  d             }t        |      }|r |j                  | }t        ||      }t        |t        dj                  t        t        j                               t        j                  g      ||d      }|j!                         S # t"        $ r-}	t%        ddt        |	      it&        j(                  d      d }	~	ww xY ww)	N    T)r'   schemaurloffsetlimituse_ormget_all_sub_regionsr!   zFailed to fetch sub-regions.r"   )r'   r
   r(   r*   r+   build_subregion_sort_queryorder_byapply_subregion_filtersr   r   joinr/   r   api_base_urlr   
SUB_REGIONpaginater.   r   r   HTTP_500_INTERNAL_SERVER_ERROR)
r   r5   r6   r7   r8   r>   r'   
sort_query	paginatorr2   s
             r3   rA   rA   3   s     
(h&#**9+?+?+C+CD+IJ 08
"ENNJ/E (w7"%X2245|7N7NOP
	 !!## 
(A'==2	
 	

s)   DCC D	D
(DD

Dc                   K   	 t        | |j                         d {   }t        |j                  |j                        }| j                  |       | j                          | j                  |       |S 7 Y# t        $ r=}| j                          t        ddt        |      it        j                  d      d }~ww xY ww)N)name	region_idr
   r!   zError creating sub-region.r"   )r   rN   r
   rM   r)   addcommitrefreshr.   rollbackr   r/   r   HTTP_400_BAD_REQUEST)r   r8   regionr1   r2   s        r3   create_sub_regionrU   X   s     
'G,=,=>>yy


 	z
		


: ?  

A'330	
 	

s9   CA9 A7AA9 6C7A9 9	B?8B::B??Cc                   K   t        | |       d {   }	 |j                  d      }d|v rt        | |d          d {   }|j                         D ]  \  }}t	        |||        | j                          | j                  |       |S 7 z7 N# t        $ r=}| j                          t        ddt        |      it        j                  d      d }~ww xY ww)NT)exclude_unsetrN   r
   r!   zError updating sub-region.r"   )r4   dictr   itemssetattrrP   rQ   r.   rR   r   r/   r   rS   )	r   r   r8   r1   update_datarT   fieldvaluer2   s	            r3   update_sub_regionr^   o   s     +B>>J
lll6 +%+BK0HIIF'--/ 	2LE5
E51	2 			


:' ? J  

A'330	
 	

sE   CBC(B  BAB CB 	C8CCCc                 J  K   t        | |       d {   }	 d|_        t        j                  t        j
                        |_        | j                          y 7 E# t        $ r=}| j                          t        ddt        |      it        j                  d      d }~ww xY ww)NTr
   r!   zError deleting sub-region.r"   )r4   
is_deletedr   nowr   utcr*   rP   r.   rR   r   r/   r   rS   r0   s       r3   delete_sub_regionrc      s     +B>>J
 $
 (X\\ :

		 ?  

A'330	
 	

s2   B#AB#?A B#	B #8BB  B#c                 x   g }| r| ndg}|D ]}  }	 |j                  dd      }|dv rCt        t        |      }|j                  d      r|j	                         }|j                  |       n!t        dd| dt        j                  d	       |S # t        $ r" t        dd| dt        j                  d	      w xY w)
z7Builds a list of SQLAlchemy sort columns for SubRegion.z-created_at-r;   )rM   
created_at
updated_atrN   rA   z&Cannot sort with unidentified column ''zError retrieving sub-regions.r"   )
replacegetattrr
   
startswithdescappendr   r   HTTP_422_UNPROCESSABLE_ENTITYAttributeError)r7   rJ   sort_fieldsscol
sort_orders         r3   rB   rB      s    J$'=/K 	))C$CGG$Y4
<<$!+!2J!!*-"0B1#QG & D D;	  .,   	,>qcC"@@7	 	s   A:B+B9c                    |s| S |j                   r>d|j                    d}| j                  t        j                  j	                  |            } |r~|j
                  rr|j
                  j                  d      D cg c]  }|j                         st        |        }}|r.| j                  t        j
                  j                  |            } | S c c}w )z9Apply filters to SubRegion query based on payload fields.%,)
searchr(   r
   rM   ilikerN   splitisdigitintin_)r'   r8   search_termrid
region_idss        r3   rD   rD      s    ~~'..)+Y^^11+>?7$$.5.?.?.E.Ec.J\sckkm#c(\J\Y%8%8%<%<Z%HIL ]s   :CC)r:   
   NN)N)1r   r   sqlalchemy.ormr   fastapir   r   src.core.exceptionsr   src.apps.base.models.regionsr	   r
   src.core.configr   src.utils.constantsr   src.apps.base.schemas.regionr   r   r   r   r   r   r   r   src.apps.base.services.countryr   src.apps.base.services.regionr   src.utils.paginationr   src.apps.base.models.countryr   uuidr   sqlalchemy.excr   typingr   r   r{   r4   r/   rA   rU   r^   rc   rB   rD        r3   <module>r      s   ' " ) , : $ ,	 	 	 = : / 0  ) !
7 
3 
9 
2 /3"
"

"
 "
 #Y	"

 +,"
J
 
2G 
.
 
 
F[ 
`i 
>
 
 
 
 S	 8r   