a
    f                    @   s   d dl m Z mZmZ d dlZd dlZd dlZd dlmZ d dlZd dl	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	lmZ d d
lmZ d dlZd dlZd dlmZ d dlZG dd dZdS )    )datetime	timedeltatimezoneN)unquote)Environment)OfferNotFoundForUserException)auth	firestore)DynamicRewardService)IntegrationsService)
SMSService)SchedulingService)FieldFilterc                   @   sZ  e Zd ZejZee eej	Ze
 Z
e ZdZdZdZdd Zdd Zdd	 Zd
d Zdd Zdd Zdd ZdHddZdd Zdd Zdd Zdd Zdd Zdd  Zd!d" ZdId$d%Z d&d' Z!d(d) Z"d*d+ Z#dJd,d-Z$d.d/ Z%d0d1 Z&d2d3 Z'd4d5 Z(d6d7 Z)d8d9 Z*d:d; Z+d<d= Z,d>d? Z-d@dA Z.e/dBdC Z0e/dDdE Z1dFdG Z2d#S )KFirestoreServicez https://graph.facebook.com/v19.0Z1154188842291843Z b79ab3ff9521b0e439a522eab93d71ccc                 C   s,   t jd| }| }|jr$|S i S d S )Nusers)r   firestore_client
collectiondocumentgetexists)phone_numberdoc_refdoc_snapshot r   K/var/www/html/python-backend/backend/services/firebase/firestore_service.pyget_user_file&   s    zFirestoreService.get_user_filec                 C   s.   zt jd|  W S    i  Y S 0 d S )N	autopilot)r   r   r   r   r   )	client_idr   r   r   get_autopilot_file1   s    z#FirestoreService.get_autopilot_filec              
   C   sj   z.t jd| }| }|jr*| ni W S  tyd } ztd|  i W  Y d }~S d }~0 0 d S )NZwhiteLabeledKitsz#Error fetching white labeled kits: )	r   r   r   r   r   r   to_dict	Exceptionprint)Zdomain_namer   docer   r   r   get_white_labeled_kits;   s    z'FirestoreService.get_white_labeled_kitsc                 C   s"   t jd| }| }| S )Noffersr   r   r   r   r   r   )offer_idr   r   r   r   r   get_offer_infoD   s
    zFirestoreService.get_offer_infoc                 C   s"   t jd| }| }| S )Nclientsr&   )r   r   r   r   r   r   get_client_infoK   s
    z FirestoreService.get_client_infoc                 C   sF   t jd| }| }|jr:| }d|v rB|d S ni }i S d S )NclientSignupssignups)r   r   r   r   r   r   r   )r   r   
client_docZclient_stats_dictr   r   r   get_client_signupsR   s    
z#FirestoreService.get_client_signupsc                  C   s   t jd} | rd S d S )Ninfluencers)r   r   r   )r   r   r   r   get_all_influencersb   s
    z$FirestoreService.get_all_influencers      ?c                 C   s  t | }|jstd| }t|d }t |}|dd u sR|ddkr|dr|drtj	|d |d |d ||d d	kp|d d
kp|d dkp|dd\}}|}nd}d}|d}t
tj  d dt|d |d dddddddddt|dd|dtjdddd}	|drH|drH||	d< ||	 t jd| d|i t |d }
tj| |
d |
d |d |d |d|||
d|d d!
 d S )"NzUser file not found.acceptedOfferscompensationr   minCompensationmaxCompensationinstagramFollowerCountcontentTypeugc
ugcPictureugcVideoisUgc
multiplierZignore_reach  clientID
exampleUGC F0   TZ>ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789   )k)UTCTimeAcceptedZUTCTimeRedeemedr?   r@   discountCodefinalValidationZiPostedZinitialValidationZ	isExpired
isRedeemed
isRejected
locationIDZ	numToPostofferIDugcURL	autoAddedr3   acceptanceIDr=   r   accountNameinstagramHandlepercentOrCashOffwhiteLabelDomainisCash)client_ig_handlecontent_typecredit_typer3   min_compensationmax_compensationwhitelabel_url	hard_cash)r   r   r   r    r   listr(   r   r
   Z&calculate_tailored_compensation_boundsroundr   utcnow	timestampstrjoinrandomchoicesappendr   r   r   updater*   r   send_private_offer_alert_text)r   r'   r=   	user_fileaccepted_offers
offer_infoZtailored_min_compZtailored_max_compr3   accepted_offerclient_infor   r   r   send_offer_to_walletj   s    

,


z%FirestoreService.send_offer_to_walletc                 C   s0  t d|  tjdt|  }t d|  | }t d|  t|d }d }|D ]}|d t|kr^|}q^|st d t	 |d }|d	 }t| d
 t| d
 tt
dd }||d||t|t|t|t| g d||||	||d}|
r|
|d< tjd|}|| t d d S )Nz)push_offer_to_manual_dashboard FB servicer   zUser file: zUser file dict: r2   rL   zOffer not found in user file.rF   rQ   _r   i Fpending)rF   ZclientInstagramHandlerH   rQ   ZinstagramIsPrivaterL   r?   rK   phoneNumberrequirementsstatusr7   ZugcUrlZ
clientNameZspecificProductZtiktokHandleemailrO   ZmanuallyValidatedOffersz!Offer pushed to manual dashboard.)r!   r   r   r   r   r`   r   r   r\   r   rb   randintset)r   r'   required_tagged_usernamer   location_idig_is_privaterV   ugc_urlclient_namespecific_productacceptance_idtiktok_handlerr   rg   rh   
offer_dataofferZutc_time_acceptedZuser_instagram_handle	file_nameZdata_to_pushr   r   r   r   push_offer_to_manual_dashboard   sn    	
z/FirestoreService.push_offer_to_manual_dashboardc                 C   s<   t jd| }|  }|d  d7  < || d S )Nr%   ZnumberOffersLeftrC   )r   r   r   r   r   r   re   )r'   Z	offer_refr}   r   r   r   increment_number_offers_left  s    z-FirestoreService.increment_number_offers_leftc                 C   s   t j| |}tj| }tjj|jdd}td|  d|j td|   t	|d }|d }t j
d|| g ||d	 td
|   d S )NT)email_verifiedzEmail verification for z status updated successfully: z#Successfully created auth account: idTokenuidclientDashboardAdmin)rr   	clientIDsuserIDrP   z:Successfully created firebase file for dashboard account: )r   r   #create_user_with_email_and_passwordfirebase_adminget_user_by_emailZupdate_userr   r!   r   Zverify_id_tokenr   r   r   create)rr   passwordaccount_nameuserZaccess_userZupdated_userZ
user_specsZuser_uidr   r   r   $create_dashboard_admin_auth_and_file  s0    	

z5FirestoreService.create_dashboard_admin_auth_and_filec                 C   s   t j| |}t j|d t jd| || |d t jd| 	 }d|vrjg |d< |d 
|  t jd|d|d i td|   d S )Nr   additionalSeats)adminIDrr   ZfullNamer   z*Successfully created additional seat for: )r   r   r   Zsend_email_verificationr   r   r   r   r   r   rd   re   r!   )rr   r   	full_nameadmin_idr   
admin_filer   r   r   add_additional_seat;  s2    

z$FirestoreService.add_additional_seatc                 C   s   t | }tjd| }| }|jr4|dnd }tjd|}|dt	
| gi |  t |j td|   d S )Nr   r   r   z*Successfully deleted additional seat for: )r   r   r   r   r   r   r   r   re   r	   ZArrayRemovedeleteZdelete_userr   r!   )rr   r   Zadditional_seatZadditional_seat_docr   r   r   r   r   delete_additional_seat`  s$    
z'FirestoreService.delete_additional_seatc                 C   s   t jd| | d S )NcontentMetadata)r   r   r   r   rt   r   metadatar   r   r   create_content_metadata_file  s
    z-FirestoreService.create_content_metadata_filec                 C   s|   t jd| }| }| }|rp|dg }|D ].}|d s6d|d< |d|i |d   S q6td ntd d S )N
batchCodescodesisUsedTcodezNo unused code found.z(Offer ID not found or document is empty.)r   r   r   r   r   r   re   r!   )r'   r   r   datar   r   r   r   r   get_batch_code  s    
zFirestoreService.get_batch_codeNc	           !      C   s  t d|   t d|  zt| } t|}W n, tyZ }	 zt |	 W Y d }	~	n
d }	~	0 0 tjd|  }
|
 }
t	|
d }d}d}d}i }d}|D ]D}|d |kr|d|ks|d kr|d	 r qt
|}|d
 }t|}|d}i }|d urt|}d}d}d|v r:|d d ur:|d }d|v rZ|d d urZ|d }|r|||d< d|d	< |
d |d< d}|d urt|tr|nd}d }|d r|d}n|dr<|dr<tj|d|d||
d|d|ddkp.|dp.|ddkp.|ddkd}||d< |d rj|}t dt| d t|  nl|d! d"kr|d#nd$}|}|d%r|d&drt|d|d% |}|st d'|  nt d(t|  nt|||d% |d% |}n"|d)drt|}t d*| |r>||d+< t d,| d-|  |d.d/ d0}tjrr|d1 |d2 |d3 |d4 gn|d5 |d6 |d7 |d8 g}|D ]B}tjtj d9tjd:d;| |d< ||||dd=d>|d? qztj| |||d@ tjrdAn
tdBdC}t |}t!|o$t"|# dDk} | rbtjtj dEtjd:d;d>| dF|||ddG|dH W n   t dI Y n0 n<d|dJ< t$| tj%| ||dkp|dkp|dk|dK tjd| &||
dL | dM  qq|S )NNz Updating final verification for z UPDATE FINAL VERIFICATION EMAIL r   r2   r   FrL   rO   rH   r?   rS   rA   ZbusinessContentApprovedTextZbusinessContentRejectedTextrM   Tr6   Z	followersP   r3   r4   r5   r=   r7   r8   r;   r9   r:   r<   rT   zCash increase for offer z is rR   ZCashZcashpercentintegrationsZ
isCashBackz Could not find latest order for zCashback done with refund ID isUploadCodesz!discount code from batch code -- rG   zDiscount code z generated for offer ZexpirationLimitiQ i ' gh㈵>giUMu>gמY?g9̗?g?g333333?gffffff?g?z/send-sms/credit-reminder/zapplication/json)AuthorizationContent-TyperP   )r   business_namer3   rW   r'   rZ   POST)http_targetheadersbodyhttp_methodfrom_now_in_seconds)rZ   discount_codebusiness_content_approved_text   i`5 im rC   z/autopilot/send-targeted-offer/content_verification)r   eventr   prev_offer_idprev_multiplier)r   r   r   r   r   z!error autopilot did not have datarJ   )rejected_reasonis_ugc_offerbusiness_content_rejected_textcashBalance)r2   r   )'r!   r   r    r   r   r   r   r   r   r\   r(   r*   r$   
isinstanceintr
   Z-calculate_rounded_dynamic_compensation_amountr`   r   Zinitiate_cashback_offerZcreate_single_use_discount_coder   r   USE_TEST_MODEr   create_taskFLASK_SERVER_URLFLASK_API_KEYr   Zsend_post_approved_textrb   rs   r   boollenkeysr   Zsend_post_rejected_textre   )!r   r'   is_validrx   rV   scorerr   r{   r   r#   rg   rh   Zcompensation_amountZcash_increaseZdiscount_amountrk   Zapprovedr~   ri   r   rZ   Zwhite_labeled_kitr   r   r   discount_type	refund_idZexpiration_days_in_secondsZdelays_in_secondsdelaydelay_in_secondsZautopilotDataZhasAutopilotOffersr   r   r   update_final_verification  sb   







 


 





 
z*FirestoreService.update_final_verificationc                 C   s   t jd S )NZinstagramBots)r   r   r   r   )selfr   r   r   get_instagram_bots  s    z#FirestoreService.get_instagram_botsc                    s\  ddl m} tjd }i i 
i }d}dd |jr| }t	|d } fdd}|  }|
||d  W d    q1 s0    Y  n
dd	d
S dddd	ddi d}tjd jstd d	| d

|dS  i }d  D ]X\}	}
z&t|	 td|	 d |
||	< W n& tjy|   td|	 d Y n0 q(|d< t	d 	
fdd}|  }|
|d  W d    n1 s0    Y  d|v r.t	|d dkr.|d D ]}ddddddd||< tjd| }|jr| }|d D ]}|| d  d7  < z|| d  t	| d 7  < || d  t	| d 7  < || d   t	| d! 7  < || d"  | d" 7  < || d#  d7  < W n   td$| d% Y n0 q\q	| d&
}d}||
|dS )'Nr   ThreadPoolExecutorr)   Z	locationsc                    sD   t jdt|  }|jr@d7 | }|d r@ d7  d S )Nr%   rC   isActive)r   r   r   r   r`   r   r   r   )acceptedOffer	offer_doc)active_offers_quantityoffers_quantityr   r   fetch_offer_data  s    zDFirestoreService.get_detailed_client_stats.<locals>.fetch_offer_datar%   FzClient not found.)successerrorr+   z6No stats document found. Returning basic client stats.T)
postsreach
storyReachr,   redemptionslocationQtyofferQtyactiveOfferQtycustomerListacceptances)r   client_statslocation_statsoffer_statscustomer_group_statsr,   zPhone number z  is registered in firebase auth.zNumber: zA is not registered in firebase auth. Excluding from signups list.c                    sv  d |  }|	vr(dddddd	|< 	| d  d7  < t jd|  }|jrb| }| vrg g g |d d| < |d 7 |d D ]}t|d	 |d	< t|d
 |d
< |d	 kr|d 
vrddddd
|d < |d
 	vrdddddd	|d
 <  d7  	|d
  d  d7  < 
|d  d  d7  < |  d |d  |d rd7 t	|  d dkr|d 7 	|d
  d  d7  < 
|d  d  d7  < 
|d  d  |d 7  < |  d |d  |d rd7 	|d
  d  d7  < 
|d  d  d7  < |  d |d  q	| d  |d 7  < nt
d|  d d S )Nr,   r   )r,   r   r   r   r   rC   r   r6   )r2   postedOffersredeemedOffersr   r2   r?   rK   rL   )r   r   r   r   r   rH   r   r   r   rI   r   r   zUser z. not found in users collection. Skipping user.)r   r   r   r   r   r   r   r`   rd   r   r!   )r   rv   user_docr   )client_acceptancesclient_customer_listr   client_postsclient_reachclient_redemptionsclient_signupsclient_signups_docclient_story_reachr   r   r   r   fetch_user_data  s    










zCFirestoreService.get_detailed_client_stats.<locals>.fetch_user_dataZcustomerGroups)customerQtySignedUpcustomerQtyTotalr   r   r   r   r   r   rC   r   r   r   r2   r   r   r   r   z	Customer z: not found in customer list. No stats to add for customer.)
r   r   r   r,   r   r   r   r   r   r   )concurrent.futuresr   r   r   r   r   r   r   r   r   mapr!   itemsr   Zget_user_by_phone_numberZUserNotFoundError)r   r   r-   r   Zlocations_quantityr   executorr   Znew_signups_for_clientr   rv   r   Zcustomer_group_idcustomer_group_docZcustomer_phone_numberr   r   )r   r   r   r   r   r   r   r   r   r   r   r   r   r   get_detailed_client_stats  s*   0
 v0




z*FirestoreService.get_detailed_client_statsc                 C   s  t ttj  d }tjd| 	 }|j
r@| }ni }|d  }|d= |||< tjd| | tjd| 	 }|j
r| }ni }|d d D ]}|d d | ||< qtjd| | |d D ]h}|dkr|dkrtjd	|	 }|j
r"| }ni }|d | ||< tjd	|| q|d
 D ]Z}	tjd|		 }
|
j
r|
 }
ni }
|d
 |	 |
|< tjd|	|
 qX|d D ]Z}tjd|	 }|j
r| }ni }|d | ||< tjd|| q|S )Nr>   ZclientStatsr   r   ZclientCommunityStatsr   rA   rB   ZlocationStatsr   
offerStatsr   ZcustomerGroupStats)r`   r]   r   r^   r_   r   r   r   r   r   r   r   copyrt   )r   statsZutc_timestampr-   Zstats_to_uploadZclient_community_stats_doccustomerlocationZlocation_docr~   r   Zcustomer_groupr   r   r   r   update_detailed_client_stats  s    





z-FirestoreService.update_detailed_client_statsc           	      C   s  ddddddddddd
}i }|d u r<t jd|  }|jr| }|d D ]@}t|}|d szt	|d  qT|d  d7  < |d	  |d
 d	 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d  |d
 d 7  < |d
 d D ]}|d
 d | ||< qnt
|| qTtttj  d }tjd|  }|jr| }ni }tjd| | |||< tjd| | |S d S )Nr   )
	clientQtyr   r   r   r,   r   r   r   r   r   r   r   r   r   r   rC   r   r   r   r   r,   r   r   r   r   r   r   r>   Z
adminStatsZadminCommunityStats)r	   clientr   r   r   r   r   r   r   r!   r   r`   r]   r   r^   r_   r   rt   )	r   	admin_docZadmin_statsZadmin_community_statsr   r   r   ZutcTimestampZadmin_stats_docr   r   r   +get_and_update_detailed_admin_account_stats  s    

z<FirestoreService.get_and_update_detailed_admin_account_statsc                  C   sZ   ddl m}  tjd }dd }|  }||| W d    n1 sL0    Y  dS )Nr   r   r   c                 S   s   t j| j| d d S )Nr   )r   r   idr  r   r   r   workerr  s    z=FirestoreService.refresh_and_update_all_stats.<locals>.workerT)r   r   r   r   r   r   r   )r   Z
admin_docsr  r   r   r   r   refresh_and_update_all_statsk  s    *z-FirestoreService.refresh_and_update_all_statsc                 C   s0   t d|  d|  tjd| | d S )Nz,inside update metadata function. file_name: z metadata: r   )r!   r   r   r   r   re   r   r   r   r   update_metadata_stats}  s    z&FirestoreService.update_metadata_statsc                 C   s   i }g }g }t jd|   }t jd|   }|r|| d|i|d< |ddrt jd|   }|dg D ],}|d	dkr||d
 || q||d< ||d< |S )Nr%   r   Z
timestampsr   r   Fr   r   r   r   batchCodeDetails)r   r   r   r   r   r   re   rd   )r'   Zoffer_details_with_statsr   r  offer_detailsr   Zbatch_offer_detailsZ
batch_coder   r   r   get_offer_stats_details  s:    
z(FirestoreService.get_offer_stats_detailsc                 C   sz   | d }zTt jd|}| jrB||  td| d n||  td|  W n   td|  Y n0 d S )NinstagramIdr/   z	Document z updated successfully.zCreating new Document: zError updating influencer: )	r   r   r   r   r   r   re   r!   rt   )Zinfluencer_datar	  Zinfluencer_doc_refr   r   r   update_influencer_data  s    


z'FirestoreService.update_influencer_datac                 C   s(   t   tj d|  }t|}| S )z)Check the validity of the Facebook token.z"/me?fields=id%2Cname&access_token=)r!   r   FB_GRAPH_API_URLrequestsr   json)access_tokenqueryresponser   r   r   check_facebook_token  s    
z%FirestoreService.check_facebook_tokenc                 C   s(   t jtj dd||| dd}| S )z&Refresh the Facebook long-lived token.z/oauth/access_tokenfb_exchange_token)
grant_typer   client_secretr  )params)r  r   r   r  r  )r  app_id
app_secretr  r   r   r   generate_new_facebook_token  s    
z,FirestoreService.generate_new_facebook_tokenc                 C   sn   t jdjtdd| dd }|rj|d }| }|di }|d}td	| |d
krfdS |S dS )NmetaInformationfbUserId==filterrC   r   metaaccessTokenz	
access =rA   missing auth tokenzuser not found)	r   r   r   wherer   limitr   r   r!   )r  	user_docsr   	user_datar  r  r   r   r   get_user_token_only  s"    


z$FirestoreService.get_user_token_onlyc                 C   s  t jd|   }td| |d ur|}|di }|d}|dkrTdS t |}d|v rt |t j	t j
}|d d }t t|d	 }t| }	d
|v rt jd| |d
 |d |	dd t jd|   }|dd|d
 ddfS ddddfS q|d d }
tt }|
| }|dk r|d d dkrt |t j	t j
}|d d }t t|d	 }t| }	d
|v rt jd| |d
 |d |	dd t jd|   }|dd|d
 ddfS ddddfS nt |}d|v r(ddddfS t |t j	t j
}|d d }t t|d	 }t| }	d
|v rt jd| |d
 |d |	dd t jd|   }|dd|d
 ddfS ddddfS |dfS nddddfS d S )Nr  Zuse_docr  r  rA   r   r   Z	expiresIn)secondsr  
expires_inT)zmeta.accessTokenzmeta.expiresInzmeta.dataAccessExpirationTimezmeta.isTokenRefreshedr   zToken refreshed)r   rq   messager     zFailed to refresh token)rq   r(  i  ZdataAccessExpirationTimei  ZisTokenRefreshedFzToken Expired...i     zUser not foundi  )r   r   r   r   r   r   r!   r  r  r  r  r   nowr   r   r_   re   time)userIdr   r$  r  r  Z
token_infoZnew_token_infor&  Zfuture_timeZ	unix_timeZdata_access_timeZcurrent_unix_timeZremain_timer   r   r   get_user_token_details  s    











z'FirestoreService.get_user_token_detailsc                 C   s   t j d| d}td|i}td|i}	d|	 d| d|  }
dd	i}tjd
|||
d}t || }|jrtt	
 d|d< ||d< |d |d< |d |d< ||d< t jd|dt|gi dS dS d S )N/z	/messagestextr  z
recipient=z!&messaging_type=RESPONSE&message=z&access_token=r   z!application/x-www-form-urlencodedr   )r   r   z%d-%m-%Y %I:%M:%S %pr_   r(  namer   usernamedm_timer  ZdmLogsTF)r   r  r  dumpsr`   r  requestget_ig_user_detailsokr   r+  strftimer   r   r   re   r	   Z
ArrayUnion)
page_tokenpage_iddm_template	sender_iddata_base_datadoc_idr3  urlr(  Zsender_datapayloadr   r  Zig_user_detailsr   r   r   send_direct_message^  s&    z$FirestoreService.send_direct_messagec                 C   s   t j d|  d| }td|}|jr| }|d dkrN|d dkrN|}q|d dkrv|d dkrv|d dd}q|d dkr|d dkrd|d d}q|d dkr|d dkr|d |d d}q| dd}n
| dd}|S )	Nr/  z&?fields=id,username,name&access_token=GETr1  rA   r2  )r1  r2  r  )r   r  r  r5  r7  r  )Z
user_ig_idr9  r?  r  resZres_datar   r   r   r6  y  s    
z$FirestoreService.get_ig_user_detailsc                 C   s`   t d tjdjtdd| dd }t d| |D ]}| }|dd	r< d
S q<d	S )Nzdm function-=-=r  r  r  r  rC   z
user_docs =dmEnableFT)	r!   r   r   r   r!  r   r"  r   r   r   r#  r   r$  r   r   r   should_send_dm  s    &
zFirestoreService.should_send_dmc                 C   sJ   t jdjtdd| dd }|D ]}| }|dd  S dS )Nr  r  r  r  rC   
dmTemplatez8Thank you for mentioning us! We appreciate your support.)r   r   r   r!  r   r"  r   r   rE  r   r   r   get_dm_template  s
    &z FirestoreService.get_dm_templatec                 C   s:  t d | d D ] }|dg  }r|D ] }|d d }|d }|d d }|d d	 d
 d d }|||d}tjdjtdd|dd }	|	r,|	D ]}
|
j	}|
d}|
d}|
d}|
d}|dkrd}|rt
|||||||}td| |      S d}|      S qq,qqqd S )Nz!Webhook response stored in the dbentry	messaging	recipientr  r,  senderr(  attachmentsr   r@  r?  )ZinstagramUserIdr-  CDNUrlr  r	  r  r  rC   Z	pageTokenZpageIdrG  rD  rA   u=   Thank you for mentioning us! We appreciate your support. 😊z
messsage_func_resonFalse)logginginfor   r   r   r   r!  r   r"  r  rA  r!   )mentions_webhook_datarI  Zmessage_datar   Zinstagram_user_idr3  r<  rN  r=  r#  r"   r>  r9  r:  r;  Z	dm_enableZmesssage_func_responseZ	dmenabledr   r   r   store_webhook_mention_response  s4    

&




z/FirestoreService.store_webhook_mention_response)r1   )NN)N)3__name__
__module____qualname__r   FIREBASE_CREDENTIALScredr   initialize_apppyrebaseFIREBASE_CONFIGr   r	   r   r   r  r  r  r   r   r$   r(   r*   r.   r0   rl   r   r   r   r   r   r   r   r   r   r   r   r   r  r  r  r
  r  r  r%  r.  rA  r6  staticmethodrF  rH  rS  r   r   r   r   r      s`   

	
VL$%  
 q  +Z
[



#r   )r   r   r   r  osrb   urllib.parser   r   rZ  environmentr   
exceptionsr   r   r	   Zservices.dynamic_reward_servicer
   Z*services.integrations.integrations_servicer   "services.notifications.sms_servicer   &services.scheduling.scheduling_servicer   r  r,  Z$google.cloud.firestore_v1.base_queryr   rP  r   r   r   r   r   <module>   s$   