
    4?iU.              
          S SK r S SKJr  S SKJr  S SKJr  S SK7  S SKJr  S SKJ	r	  S SK
Jr  S S	KJr  S S
KJrJrJr  S SKJrJrJr  S SKJrJrJrJrJr  S SKJrJr  S SKJ r J!r!  \" SS/S9r"\#" S5        \"RI                  S\S9\" \	5      4S\S\4S jj5       r%\"RM                  S\S9\" \	5      4S\'S\4S jj5       r(\"RI                  S5      \" \	5      4S\S\4S jj5       r)\"RI                  S5      \" \	5      4S\*S\4S jj5       r+\"RI                  S 5      \" \	5      4S\,S\4S! jj5       r-\"RM                  S"5      \" \	5      4S#\'S\4S$ jj5       r.\"RM                  S%5      \" \	5      \" S&S'S(9\" S S S(94S)\/S\S*\/S+\/4S, jj5       r0\"RM                  S-5      \" \	5      \" S&S'S(9\" S S S(94S\'S\S*\/S+\/4S. jj5       r1g)/    N)datetime)Session)aliased)*)Client)get_db)Visitor)AsyncSession)funcselectliteral_column)VisitorCreate
VisitorOutClientVisitor)	APIRouterDependsHTTPExceptionRequestQuery)VisitorPageViewVisitorActivity)create_or_get_visitorget_visitor_by_visitor_idz	/visitorsVisitors)prefixtagsz. ---------------- in visitor ---------------- /)response_modeldatadbc                 L   #    [        SU 5        [        X5      I Sh  vN $  N7f)zY
If visitor exists (same visitor_id + client_id), return it.
If not, create new visitor.
z><><><><><><><><>N)printr   )r   r    s     5/var/www/html/livechat/backend/app/routers/visitor.pyadd_visitorr$      s#      

d#&r0000s   $"$z/{visitor_id}
visitor_idc                 Z   #    [        X5      I Sh  vN nU(       d
  [        SSS9eU$  N7f)zQ
Admin & Visitor WebSocket checks if visitor exists
before allowing the session.
Ni  zVisitor not found)status_codedetail)r   r   )r%   r    visitors      r#   get_visitorr*   '   s/      .b==G4GHHN	 >s   +)+z/auto-createrequestc           
        #    U R                  5       I S h  vN nUR                  S5      nUR                  [        [        5      R                  [        R                  U:H  5      5      I S h  vN nUR                  5       n[        [        R                  " 5       5      S S nU R                  R                  nU R                  R                  SS5      nUR                  S5      nUR                  S5      n	UR                  S5      n
[        UR                  UUUU	U
S S9nUR!                  U5        UR#                  5       I S h  vN   S	U0$  GN8 N N7f)
Nclient_widget_id   z
user-agent countryregioncity)	client_idr%   
ip_addressr0   r1   r2   namer%   )jsongetexecuter   r   wherer-   scalar_one_or_nonestruuiduuid4clienthostheadersr	   idaddcommit)r+   r    bodyr-   client_Datavisitor_uidr4   
user_agentr0   r1   r2   r)   s               r#   auto_create_visitorrH   7   s-    Dxx 23

6N  !8!8<L!LM K 002K djjl#BQ'K $$J$$\26J hhy!GXXhF88FD ..G FF7O
))++&&M  @ s5   EEAE-E.CEE	EEEz
/page-viewc                    #    [        U R                  U R                  U R                  U R                  S9nUR                  U5        UR                  5       I S h  vN   SSS.$  N	7f)N)r%   r-   page_url
page_titlesuccesszPage view recordedstatusmessage)r   r%   r-   rJ   rK   rB   rC   )r   r    new_views      r#   	page_viewrQ   b   s]      ??..??	H FF8
))+,@AA s   AA'A%
A'z/live-activityc                 L  #    UR                  [        [        5      R                  [        R                  U R                  :H  5      5      I S h  vN nUR                  5       R                  5       nU(       a=  U R                  Ul        [        R                  " 5       Ul        U R                  Ul        ON[        U R                  U R                  U R                  [        R                  " 5       S9nUR                  U5        UR                  5       I S h  vN   SSS.$  N N7f)N)r%   current_page	timestamplast_activerL   zActivity updatedrM   )r8   r   r   r9   r%   scalarsfirstrJ   rS   r   utcnowrU   rT   rB   rC   )r   r    resultactivitys       r#   live_activityr[   u   s      ::%%o&@&@DOO&ST F ~~%%'H $'0!^^ #nn )	
 	x
))+,>??/* s%   AD$D CD$D"
D$"D$z/stats/visitor-statsr-   c           
      X  #    [        [        5      n[        UR                  UR                  UR
                  [        R                  " [        R                  S5      R                  S5      [        R                  " [        R                  5      R                  S5      [        S5      R                  S5      5      R                  U[        R                  UR                  :H  5      R!                  UR                  U :H  5      R#                  UR                  [        R                  " [        R                  S5      5      n[        UR                  UR                  UR
                  [        R$                  " [        R                  5      R                  S5      [        R                  " [        R                  5      R                  S5      [        S5      R                  S5      5      R                  U[        R                  UR                  :H  5      R!                  UR                  U :H  5      R#                  UR                  [        R$                  " [        R                  5      5      n[        UR                  UR                  UR
                  [        R                  " [        R                  S5      R                  S5      [        R                  " [        R                  5      R                  S5      [        S5      R                  S5      5      R                  U[        R                  UR                  :H  5      R!                  UR                  U :H  5      R#                  UR                  [        R                  " [        R                  S5      5      n[        UR                  UR                  UR
                  [        R                  " [        R                  S	5      R                  S5      [        R                  " [        R                  5      R                  S5      [        S
5      R                  S5      5      R                  U[        R                  UR                  :H  5      R!                  UR                  U :H  5      R#                  UR                  [        R                  " [        R                  S	5      5      n[        UR                  UR                  UR
                  [        S5      R                  S5      [        R                  " [        R                  5      R                  S5      [        S5      R                  S5      5      R                  U[        R                  UR                  :H  5      R!                  UR                  U :H  5      R#                  UR                  5      nUR'                  UUUU5      nUR)                  U5      I S h  vN n	U	R+                  5       n
0 nU
 H  u  ppnnX;  a  UU/ / / / SS.X'   US:X  a  X   S   R-                  UUS.5        M:  US:X  a  X   S   R-                  UUS.5        M[  US:X  a  X   S   R-                  UUS.5        M|  US:X  a  X   S   R-                  UUS.5        M  US:X  d  M  XU    S'   M     SU0$  N7f)Nz%Y-%m-%dperiodvisitor_countz'day'period_typez'week'z%Y-%mz'month'z%Yz'year'z	'overall'r   )client_namewebsite_urldaily_statsweekly_statsmonthly_statsyearly_statsoverall_visitorsdayrb   )rg   total_visitorsweekrc   )ri   rh   monthrd   )rj   rh   yearre   )rk   rh   overallrf   stats)r   r   r   r-   r`   ra   r   date_formatr	   
created_atlabelcountrA   r   joinr3   r9   group_byyearweek	union_allr8   allappend)r-   r    ClientAlias
daily_stmtweekly_stmtmonthly_stmtyearly_stmtoverall_stmt
union_stmtrY   rowsr   r`   ra   r]   r^   r_   s                    r#   visitor_statsr      sT     &/K 	((####W//<BB8LJJwzz"((97#))-8	
 
k7,,>	?	{++/??	@	+..0@0@ASASU_0`	a   	((####MM',,-33H=JJwzz"((98$**=9	
 
k7,,>	?	{++/??	@	+..g>P>P0Q	R   	((####W//9??IJJwzz"((99%++M:	
 
k7,,>	?	{++/??	@	+..0@0@ASASU\0]	^   	((####W//6<<XFJJwzz"((98$**=9	
 
k7,,>	?	{++/??	@	+..0@0@ASASUY0Z	[   	((####;'--h7JJwzz"((9;'--m<	
 
k7,,>	?	{++/??	@	+..	/  %%	J ::j))F::<D DZ^V{M;'**! "!# "$%&D" %"=188"/: 
 F"">299"/; 
 G#"?3::"/< 
 F"">299"/; 
 I%9F!"#56M [_P T?] *s   WZ*Z(B9Z*Z*z/clients/{client_id}/visitors
      )ger3   limitoffsetc                 j  #    [        [        5      R                  [        R                  U :H  5      R	                  [        R
                  R                  5       5      R                  U5      R                  U5      nUR                  U5      I S h  vN nUR                  5       R                  5       n[        [        R                  " 5       5      R                  [        5      R                  [        R                  U :H  5      nUR                  U5      I S h  vN R                  5       nUUS.$  N N7f)N)visitorstotal)r   r	   r9   r3   order_byro   descr   r   r8   rV   rv   r   rq   select_fromscalar)	r3   r    r   r   stmtrY   r   
count_stmtr   s	            r#   get_visitors_by_clientr   &  s      	w	w  I-	.	'$$))+	,	u	 	 ::d##F~~##%H 	tzz|	W		w  I-	.  ::j))113E   $ *s%   BD3D/BD3D1D31D3z/live-page/viewsc           
      0  #    [        [        5      R                  [        R                  U :H  5      R	                  [        R
                  R                  5       5      R                  U5      R                  U5      nUR                  U5      I Sh  vN nUR                  5       R                  5       n[        [        R                  " 5       5      R                  [        5      R                  [        R                  U :H  5      nUR                  U5      I Sh  vN R                  5       nU V	s/ s HH  n	U	R                   U	R                  U	R"                  U	R$                  U	R&                  U	R
                  S.PMJ     n
n	U UUUX2-  S-   U
S.$  N Nws  sn	f 7f)z=
Returns paginated page-view activity timeline for a visitor
N)rA   r%   r-   rJ   rK   ro   r   )r%   total_viewsr   r   page
page_views)r   r   r9   r%   r   ro   r   r   r   r8   rV   rv   r   rq   r   r   rA   r-   rJ   rK   )r%   r    r   r   r   rY   r   r   r   rr   s              r#   get_visitor_page_viewsr   M  sT     		))Z7	8	/,,113	4	u	 	 ::d##F>>!D 	tzz|	_	%	))Z7	8  J//779K 
 A $$,, ! 2 2

,,,,	
   
 !"A%  7 $ 0
s8   BFFBFFF.AF=FFF)2r<   r   sqlalchemy.ormr   r   app.schemas.page_viewapp.models.clientr   app.core.databaser   app.models.visitorr	   sqlalchemy.ext.asyncior
   
sqlalchemyr   r   r   app.schemas.visitorr   r   r   fastapir   r   r   r   r   app.models.page_viewr   r   app.services.visitorr   r   routerr"   postr$   r7   r;   r*   rH   PageViewSchemarQ   ActivityPingSchemar[   r   intr   r        r#   <module>r      sV     " " # $ $ & / 3 3 H H E E @ Q	+ZL	9 6 7 S,9@ 1M 1w 1 -1 OJ75<V_ 	# 	7 	 8	 ^CJ6? ''w ''L '' ''T \8? B. Bg B B$ ELV_ @0 @l @ @@ "# vHHH $H^ +, vraa.	  	 -L  vraa.	777 7 	7  7r   