
    h\(                        d dl m Z  d dlmZ d dlZd dl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 d d	lmZ d d
lmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZmZm Z  d dl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edede)de)de&e*   de%fdZ+dededefdZ,	 d#dedede&e*   de-fdZ.dededefdZ/dede)defdZ0dede)de defdZ1dede)de2fdZ3ded e*de4fd!Z5y)$    )datetime)UUIDN)Session)HTTPExceptionstatus)FileResponse)StreamingResponse)APIException)QueryPaginator)EXPORT_DATA_SUB_FOLDER)funccastIntegerand_or_)GlobalNoise)GlobalNoiseCreateSchemaGlobalNoiseFilterSchemaGlobalNoiseOutputSchemaGlobalNoiseUpdateSchema)API_PREFIXES)settings)DictList)	nullslastdbpayloadpageper_pagesort_byreturnc           
      
  K   t        | ||       d{   \  }}|dz
  |z  }t        |t        dj                  t	        t        j                               t        j                  g      ||      }|j                         S 7 mw)zE
    Get all global noise entries with pagination and filtering.
    N    )queryschemaurloffsetlimit)
_build_global_noise_queryr   r   joinstrr   api_base_urlr   GLOBAL_NOISEpaginate)	r   r   r   r   r    r%   _r(   	paginators	            j/var/www/html/wine-match-dev/backend/winematch-backend/src/apps/wine/global_noise/services/global_noise.pyget_all_global_noise_servicer3      s}      /r7GDDHE1Qh("F&GGS..01<3L3LMNI  Es   BBA.Bc                   	
K   	 t        | |dg       d{   \  }}|j                  t        j                        j	                         
t        j                         j                  d      }d| d}t        }t        j                  |d       t        j                  j                  ||      		
fd	}t         |       d
d| dd      S 7 # t        $ r+}t        dt!        |      t"        j$                  d      d}~ww xY ww)zL
    Download global noise data as a text file with streaming response.
    z-updated_at)r    Nz%Y-%m-%d-%H%M%Szglobal-noise_z.txtT)exist_okc                    K   t        dd      5 } D ]&  }|d   s	|d    d}| j                  |       | ( | j                          d d d        y # 1 sw Y   y xY ww)Nwzutf-8)encodingr   
)openwriteflush)fhnoise_tupleline	file_path
noise_lists      r2   stream_generatorz0download_noise_service.<locals>.stream_generatorL   sk     iw7 	2#- #K"1~"-a.!14"
# 
	 	 	s!   A#A0A	A#A A#z
text/plainzattachment; filename=chunked)zContent-DispositionzTransfer-Encoding)
media_typeheadersdownload_noise_servicez$Error downloading global noise data.moduleerrorstatus_codemessage)r*   with_entitiesr   noiseallr   nowstrftimer   osmakedirspathr+   r	   	Exceptionr
   r,   r   HTTP_500_INTERNAL_SERVER_ERROR)r   r   r%   r0   current_timefilenamedownload_dirrB   er@   rA   s            @@r2   rF   rF   3   s     .
22wXXq (():):;??A
  ||~../@A"<.5 .
L40 GGLLx8		 !#)>xj'I%.
 	
; YL  
+a&==:	
 	

s9   DC CB8C DC 	D&DDDc                   K   | j                  t              j                  t        j                  j	                  d            }t        |d      rX|j                  rLd|j                  j                          d}|j                  t        j                  j                  |            }t        |d      r8|j                  r,|j                  t        j                  |j                  k\        }t        |d      r8|j                  r,|j                  t        j                  |j                  k        }g }|r|D ]  }	 |j                  dd      }|dv rLt        t        |      }|j                  d      r|j!                         }|j#                  t%        |             n!t'        d	d
| dt(        j*                  d       |r |j.                  | }||fS # t,        $ r" t'        d	d
| dt(        j*                  d      w xY ww)zI
    Build the query for global noises based on filters and sorting.
    Nsearch%	date_fromdate_to-r$   )idrM   
created_at
updated_atr3   z&Cannot sort with unidentified column ''zError retrieving global noises.rG   )r%   r   filter
deleted_atis_hasattrr[   striprM   iliker]   ra   r^   replacegetattr
startswithdescappendr   r
   r   HTTP_422_UNPROCESSABLE_ENTITYAttributeErrororder_by)	r   r   r    r%   search_term
sort_queryscol
sort_orders	            r2   r*   r*   k   s     HH[!(()?)?)C)CD)IJEw!gnn'....013##K0
 w$):):[33w7H7HHIw	"w[33wFG J 	AiiR(EE!(c!:J||C(%/__%6
%%i
&;<&= FqcK$*$H$H A	  =	2 "ENNJ/E* " "9B1#QG & D D=	 s   D7H:BG=H+G??Hc                   K   	 t        | |j                         d{   }|rt        dddit        j                  d      t        |j                        }| j                  |       | j                          | j                  |       t        j                  |      S 7 # t        $ r+}t        dt        |      t        j                  d      d}~ww xY ww)z*
    Create a new global noise entry.
    Ncreate_global_noiserM   Noise already exists.rG   )rM   zError creating global noise.)check_existing_global_noiserM   r
   r   HTTP_400_BAD_REQUESTr   addcommitrefreshr   from_ormrT   r,   rU   )r   r   existing_noise	new_noiserY   s        r2   rx   rx      s     
:2w}}MM, 78"77/	   --
	 	y
		


9&//	:: N   
(a&==2	
 	

s9   CB" B BB" C B" "	C+&CCCglobal_noise_idc                   K   	 | j                  t              j                  t        j                  |k(  t        j                  j                  d            j                         }|s!t        dd| dt        j                  d      |S # t        $ r+}t        dt        |      t        j                  d      d}~ww xY ww)z2
    Retrieve a global noise entry by its ID.
    Nget_global_noise_by_id_serviceGlobal noise with ID  not found.Global noise not found.rG   zError retrieving global noise.)r%   r   rd   r`   re   rf   firstr
   r   HTTP_404_NOT_FOUNDrT   r,   rU   r   r   rM   rY   s       r2   r   r      s     
%,,NNo-""&&t,
 %' 	
 7-o->kJ"551	   
3a&==4	
 	

s)   CBB
 	C
	B>&B99B>>Cc                   K   	 t        | |       d{   }|j                  rX|j                  |j                  k7  r?t        | |j                         d{   }|rt        dddit        j
                  d      |j                  |j                  |_        | j                          | j                  |       t        j                  |      S 7 7 z# t        $ r+}t        dt        |      t        j                  d      d}~ww xY ww)z0
    Update an existing global noise entry.
    Nupdate_global_noiserM   ry   rG   zError updating global noise.)r   rM   rz   r
   r   r{   r}   r~   r   model_validaterT   r,   rU   )r   r   r   update_noiser   rY   s         r2   r   r      s     
;BPP==W]]l.@.@@#>r7==#QQN"0"$;< & ; ;3	  ==$!(L
		


< &55lCC QQ  
(a&==2	
 	

sL   D
C CAC CA7C D
C C 	D&DDD
c                 B  K   	 t        | |       d{   }|s!t        dd| dt        j                  d      t	        j
                         |_        | j                          i S 7 R# t        $ r+}t        dt        |      t        j                  d      d}~ww xY ww)zO
    Soft delete a global noise entry by setting its deleted_at timestamp.
    Ndelete_global_noiser   r   r   rG   zError deleting global noise.)r   r
   r   r   r   utcnowre   r}   rT   r,   rU   r   s       r2   r   r     s     
4RII,-o->kJ"551	  $??,
			 J  
(a&==2	
 	

s9   BA( A&AA( %B&A( (	B1&BBBrM   c                 D  K   	 | j                  t              j                  t        j                  |k(  t        j                  j                  d            j                         }|duS # t        $ r+}t        dt        |      t        j                  d      d}~ww xY ww)zL
    Check if a global noise entry with the given noise already exists.
    Nrz   z%Error checking existing global noise.rG   )r%   r   rd   rM   re   rf   r   rT   r
   r,   r   rU   )r   rM   r   rY   s       r2   rz   rz     s     
+.55&""&&t,
 %' 	 T)) 
0a&==;	
 	

s)   B A$A) (B )	B2&BBB )r#   
   N)N)6r   uuidr   rQ   aiofilessqlalchemy.ormr   fastapir   r   fastapi.responsesr   starlette.responsesr	   src.core.exceptionsr
   src.utils.paginationr   src.utils.constantsr   
sqlalchemyr   r   r   r   r   .src.apps.wine.global_noise.models.global_noiser   /src.apps.wine.global_noise.schemas.global_noiser   r   r   r   r   src.core.configr   typingr   r   sqlalchemy.sql.expressionr   intr,   r3   rF   tupler*   rx   r   r   anyr   boolrz        r2   <module>r      s     	  " ) * 1 , / 6 3 3 F  - $  / ,   $    	 
 #Y  
 05
5
$5
 5
v 55$5 #Y5 	5n

$
 
@


 
<


 %
 	
D


 	
:


 

r   