
    wh2                        d dl mZmZmZ d dlmZ d dlmZmZ d dl	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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mZ d dlmZ d dlZd dlZd dlZd dlm Z  d dl!m"Z" d dl#Z#d dl$m%Z%  e"         ejL                  d      Z'e%jP                  Z(e%jR                  Z)e%jT                  Z*e%jV                  Z+e%jX                  Z, e#jZ                  e(e)e*e+d      Z.de/de0defdZ1dede/de/defdZ2 ejL                  d      Z3 ejL                  d      Z4 ejL                  d      Z5 ejL                  d      Z6 ejL                  d      Z7 ejL                  d       Z8d!edefd"Z9	 	 d'dede/d#e/d$e/d%e/f
d&Z:y)(    )Depends
UploadFileHTTPException)Session)funccaseN)
Datasource)get_current_user)process_csv_datacreate_datasourcesave_csv_file)StoreBranch)r   r   )get_db)ExternalDatasourceCreateInternalDatasourceCreate)create_external_data_source)urlparse)load_dotenv)settingsCSV_WEBHOOK_URLT)app_idkeysecretclusterssldatasource_id	file_pathdbc                 B   K   t        || |t               d{   S 7 w)zP
    Controller for processing CSV file and sending reviews to the webhook.
    N)r   r   r   r   r   s      =/var/www/html/hubwallet-dev/src/apps/datasource/controller.pyprocess_csv_reviewsr#   -   s      ""mYPPPPs   filestore_id	branch_idc                 .  K   |j                  t              j                  t        j                  |k(  t        j                  |j                  k(        j                         }|st        ddddd      |j                  t              j                  t        j                  |k(  t        j                  |k(  t        j                  |j                  k(        j                         }|st        ddddd      t        |       }	 t        j                  |      }h d}	|	j                  t        |j                              st        dddd	d      	 t)        ||||      }	 t+        t-        |j.                        t'        |      |       d{   }d}t0        j3                  |d|j.                  dddddd       ddd|j.                  t'        |j4                        ||ddS # t        j                  j                   $ r t        dd
      t        j                  j"                  $ r t        dd      t$        $ r}
t        ddt'        |
             d}
~
ww xY w7 # t$        $ r"}
t        ddddt'        |
       d      d}
~
ww xY ww)zB
    Controller for handling CSV file uploads and processing.
      Fz!Unauthorized access to this storestatuscodemessagestatus_codedetail"Unauthorized access to this branch>   datenameratingcomment  zFCSV format is incorrect. Required columns: name, comment, rating, datezCSV file is empty or invalid.zCSV file could not be parsed.  zError reading CSV: Nr!   zError processing CSV: import-updateprogress-updater   fetchingFetching recordsr   	processedtotalpercentr*   
status_msg
event_namedataT   z0CSV uploaded and processing started successfully)r   snapshot_idfile_urlprocessing_resultr*   r+   r,   rB   )queryr   filterr%   user_idfirstr   r   r&   r   pdread_csvissubsetsetcolumnserrorsEmptyDataErrorParserError	Exceptionstrr   r#   intds_idpusher_clienttriggerrD   )r$   r%   r&   r   userstorebranchr   dfrequired_columnsedatasource_entryresultchannel_names                 r"   upload_csv_filerc   4   s    
 HHUO""5>>X#=u}}PTP\P\?\]cceE#S=`a
 	
 XXf$$I%8#$,,& eg	 
 #S=ab
 	
 d#IT[[#@((RZZ9"' ##k  :" )Xy)L
*.445)n
 
 #L$-33 ,
   E-33/;;<!!'	
	
 
O 99## U4STT99   U4STT T6I#a&4RSST
  
#S?UVYZ[V\U]=^_
 	

sc   DJAG) J#-I' I%I' AJ)AI"II""J%I' '	J0JJJBRIGHT_DATA_TOKENWEBHOOK_STATIC_TOKENWEBHOOK_BASE_URLBRIGHT_DATASET_IDGOOGLE_DATASET_IDBRIGHT_DATA_API_URLrB   c                    t        | j                        j                         dv r	t        }d}nt	        fddD              rt
        }d}t        t        | j                              }|j                  xs d}|j                  d      sad}|j                  |      j                         }t        d	| j                          t        d
|        || _        nt        ddddd      dt         dd}	t         d}
t         d}||
dt         dd|dd}dt        | j                        ig}	 t!        j"                  t$        |	||      }|j'                          t        d       t        d|j(                          t        t+        j,                  |j+                         d             |j+                         }t5        |t6              rd$|vrt        d%       t        dddd&d      |d$   }t9        | |||      }d'}t:        j=                  |d(|j>                  d)d)d)d*d+d,-       d.d/d0|j>                  |j@                  |j                  d1d2S # t         j.                  j0                  $ r0}t        d|        t        dddd t        |       d      d!}~wt         j.                  j2                  $ r t        d"       t        dddd#d      w xY w)3zd
    Controller function to handle adding external data sources and triggering Bright Data API.
    yelpc              3   &   K   | ]  }|v  
 y w)N ).0keywordurl_strs     r"   	<genexpr>z+add_external_data_source.<locals>.<genexpr>   s     JGWJs   )googlemapszg.corr    z
google.comzwww.google.com)netloczOriginal Google URL: zCorrected Google URL: r5   FzUnsupported data source URLr)   r-   zBearer zapplication/json)AuthorizationzContent-Typez/webhookz/notifyjsontrue)
dataset_idendpointauth_headerformatuncompressed_webhooknotifyinclude_errorsurl)headersparamsrw   z%
===== Bright Data API Response =====zStatus Code:    )indentz&Error making Bright Data API request: r6   z Bright Data API request failed: Nz,Error: Bright Data API returned invalid JSONz%Bright Data API returned invalid JSONrD   z,Error: Invalid response from Bright Data APIz%Invalid response from Bright Data APIr7   r8   r   r9   r:   r;   r@   TrC   z'External data source added successfully)r   rD   r   rG   )!rU   r   lowerrg   anyrh   r   hostnameendswith_replacegeturlprintr   rd   rf   re   requestspostri   raise_for_statusr.   rw   dumps
exceptionsRequestExceptionJSONDecodeError
isinstancedictr   rX   rY   rW   rD   )rB   r   rZ   selected_dataset_idsource_type
parsed_urlr   corrected_hostnamecorrected_urlr   webhook_url
notify_urlr   data_payloadresponsebright_data_responsereq_errrD   r`   rb   rp   s                       @r"   add_external_data_sourcer      s    $((m!!#G /	J/IJ	J/ c$((m,
&&,"  .!1&//7I/JQQSM)$((45*=/:;$DH #S=Z[
 	
 ##4"56*G &&h/K$%W-J * !5 67 & F CM*+L
==!4gf[gh!!#67h22345djj34'}}  *D1]J^5^<=#S=de
 	

 '}5K 34T;O"L$-33 ,
   <-33+77#''
		 	S // 
6wi@A#S?_`cdk`l_m=no
 	

 .. 
<=#S=de
 	

s   6BI K 8+J##=K rJ   page	page_sizec                 4   | j                  t              j                  t        j                  |k(  t        j                  |k(        j                         }|st        ddddd      |j                  }t        t        j                  dk(  dft        j                  dk(  d	ft        j                  d
k(  dfd      }| j                  t              j                  t        j                  |k(        j                  t        j                  j                         |      }|||j                         }	nO|j                         }
|j!                  |dz
  |z        j#                  |      j                         }	|
|z   dz
  |z  }|	sddddS |	D cg c]i  }|j$                  |j                  ||j&                  |j(                  |j                  |j*                  |j,                  |j.                  |j                  d
k }}ddd|d}||

||d|d<   |S c c}w )aH  Retrieve datasource records for a given branch_id that belongs to the logged-in user.
    
    - If pagination parameters (`page` & `page_size`) are provided, return paginated results.
    - Otherwise, return the full list.
    - Sorting Order: Status (`completed` > `pending` > `failed`), then `created_at` (latest first).
    r(   Fr0   r)   r-   	completed   pending   failed   r   )else_i  z No records found for this branch)
r%   r&   branch_namer   last_fetch_datelast_fetch_statusrW   r   rD   
created_atTrC   z)Datasource records retrieved successfullyrG   )total_recordstotal_pagescurrent_pager   
pagination)rH   r   rI   r&   rJ   rK   r   r   r   r	   r   order_byr   descallcountoffsetlimitr%   r   r   rW   r   rD   )r   r&   rJ   r   r   r\   r   status_orderdatasource_querydatasource_entriestotal_datasourcesr   entryformatted_datar   s                  r"   fetch_datasource_by_branchr     s<    XXf$$V%5%5%BFNNV]D]^ddfF#S=ab
 	

 $$K 		%	%	4a8		%	%	2A6		%	%	115	L xx
+22	)h""$  |y(-113 -224 .44dQh)5KLRRS\]aac )94q8YF 9
 	
( (  &99$44!&!8!8[[ ,, ,,**	
N " >	H I1.& "	"
 OAs   A.H)NN);fastapir   r   r   sqlalchemy.ormr   
sqlalchemyr   r   pandasrL   src.apps.datasource.modelsr	   src.apps.auth.controllerr
   src.apps.datasource.servicesr   r   r   src.apps.stores.modelsr   r   src.utils.dbr   src.apps.datasource.schemasr   r   r   r   osrw   urllib.parser   dotenvr   pushersrc.utils.settingsr   getenvr   r   r   r   r   
batch_sizePusherrX   rV   rU   r#   rc   rd   re   rf   rg   rh   ri   r   r   rm       r"   <module>r      s   6 6 " !  1 5 Z Z 0 * "  5 Z D  	  !   ' "))-. 
ll	


  
 QS QS Qg QY
 Yc Yc Yw YB BII12  ryy!78 299/0 BII12 BII12 bii 56 z
"zzH ``` ` 	`
 `r   