
    CShR                     .   d dl mZ d dlmZ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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dedede	e   de	e   de	e   de	e   de	e   fdZ	 	 	 ddedede	e   de	e   de	e   de	e   de	e   fdZ	 	 	 	 	 ddedede	e   de	e   de	e   de	e   de	e   fdZ 	 	 	 	 	 ddedede	e   de	e   de	e   de	e   de	e   fdZ!	 	 	 	 	 ddedede	e   de	e   de	e   de	e   de	e   fdZ"y)    )Session)HTTPExceptionDepends)ListDictAnyOptional)datetime)func)FeedbackTask)TaskResponseSentimentCountResponse)
Datasource)Branch)get_db)get_current_user)r
   	timedeltaN	branch_iddbsource
start_dateend_date
min_rating
max_ratingc           
         |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        ddddg d      |r|sSt        j                         j                  d      }t        j                         t        d      z
  j                  d      }|j                  t        j                  j                  d	      t        j                         j                  t        j                   d
k(        j                  d
      t        j                         j                  t        j                   dk(        j                  d      t        j                         j                  t        j                   dk(        j                  d      t        j                         j                  t        j                   dk(        j                  d            j                  t        j                  | k(        }	|r"|	j                  t        j"                  |k(        }		 t        j$                  |d      }t        j$                  |d      }|	j                  t        j                  j'                  ||            }	|"|	j                  t        j*                  |k\        }	|"|	j                  t        j*                  |k        }	|	j-                  t        j                        j/                  t        j                        j1                         }
|
sdddg dS |
D cg c][  }|j2                  j                  d      |j4                  xs d|j6                  xs d|j8                  xs d|j:                  xs dd] }}ddd|dS # t(        $ r t        ddddd      w xY wc c}w )z
    Fetch sentiment counts grouped by feedback_posting_date for a given branch.
    Ensures the branch belongs to the logged-in user.
    Allows filtering by source, date range, and rating range.
      F"Unauthorized access to this branchstatuscodemessagedatastatus_codedetail%Y-%m-%d   daysnamepositivenegativemixedneutral  #Invalid date format. Use YYYY-MM-DDr    r!   r"   T   'No sentiment data found for this branchr   )dater,   r-   r.   r/   z.Sentiment analysis data retrieved successfully)queryr   filterr   user_idfirstr   r
   todaystrftimer   r   feedback_posting_datelabelr   count	sentimentfeedback_sourcestrptimebetween
ValueErrorfeedback_ratinggroup_byorder_byallr+   r,   r-   r.   r/   )r   r   userr   r   r   r   r   branchr6   resultsrowsentiment_lists                ;/var/www/html/hubwallet-dev/src/apps/feedback/controller.pyfetch_sentiment_countsrN      s(    XXf$$V%5%5%BFNNVZVbVbDbciikF#S=akmn
 	
 X>>#,,Z8nn&);;EEjQ
 HH&&,,V4

H..*<=CCJO

H..*<=CCJO

H..'9:@@I

H..);<BB9M fX9,- 
 X55?@
&&z:>
$$Xz:X;;CCJPXYZ X55CDX55CD nnX;;<EEhFdFdeiikG@	
 	
  	  HH%%j1))YY^!{{'a	
	N 	 C	 G  
#S=bc
 	

0	s   AN)  A O)Oc           	         |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        ddddg d      |r|sSt        j                         j                  d      }t        j                         t        d      z
  j                  d      }|j                  t              j                  t        j                  | k(        }	|r"|	j                  t        j                  |k(        }		 t        j                  |d      }t        j                  |d      }|	j                  t        j                  j                  ||            }	|"|	j                  t        j"                  |k\        }	|"|	j                  t        j"                  |k        }	|	j%                  t'        j(                  t        j*                              j-                         }
|
dk(  rdddg dS |	j%                  t'        j(                         j                  t        j.                  dk(        j1                  d      t'        j(                         j                  t        j.                  dk(        j1                  d      t'        j(                         j                  t        j.                  dk(        j1                  d      t'        j(                         j                  t        j.                  dk(        j1                  d            j                         }t3        |j4                  xs d|
z  dz  d      t3        |j6                  xs d|
z  dz  d      t3        |j8                  xs d|
z  dz  d      t3        |j:                  xs d|
z  dz  d      d}|j=                         D cg c]
  \  }}||d }}}ddd|dS # t         $ r t        d	dd	d
d      w xY wc c}}w )z
    Fetch sentiment breakdown percentages for a given branch.
    Ensures the branch belongs to the logged-in user.
    Allows filtering by source, date range, and rating range.
    r   Fr   r   r$   r'   r(   r)   r0   r1   r2   r   Tr3   r4   r,   r-   r.   r/   d      )r,   r-   r.   r/   )r?   
percentagez*Sentiment breakdown retrieved successfully)r6   r   r7   r   r8   r9   r   r
   r:   r;   r   r   r@   rA   r<   rB   rC   rD   with_entitiesr   r>   feedback_idscalarr?   r=   roundr,   r-   r.   r/   items)r   r   rH   r   r   r   r   r   rI   r6   total_countsentiment_countssentiment_datakeyvalueresponse_datas                   rM   fetch_sentiment_breakdownr^   g   s    XXf$$V%5%5%BFNNVZVbVbDbciikF#S=akmn
 	
 X>>#,,Z8nn&);;EEjQ
 HHX%%h&8&8I&EFE X55?@
&&z:>
$$Xz:X;;CCJPXYZ X55CDX55CD %%djj1E1E&FGNNPKa@	
 	
 	JJL 2 2j @AGG
SJJL 2 2j @AGG
SJJL 2 2g =>DDWMJJL 2 2i ?@FFyQ		
 
  +449[H3NPQR+449[H3NPQR(..3!{BSH!L*227a;FLaP	N CQBVBVBX4>Cc/M 
 ?	 _  
#S=bc
 	

Vs   %AO% P%P c                 n   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        ddddg d      |r|s$t        j                         }	|	t        d      z
  }
n-	 t        j                  |d      }
t        j                  |d      }	|	|
z
  j                  }|j                  t              j                  t        j                  | k(        }|r"|j                  t        j                  |k(        }|j                  t        j                  j!                  |
|	            }|Q|O|dk  s
|dkD  s||kD  rt        d	dd	dd      |j                  t        j"                  j!                  ||            }|j%                  t'        j(                  t        j*                              j-                         }|dk(  rdddddg ddS |dk  r|j%                  t        j                  j/                  d      t'        j(                  t        j*                        j/                  d            j1                  t        j                        j3                  t        j                        j5                         }n|j%                  t'        j6                  dt        j                        j/                  d      t'        j(                  t        j*                        j/                  d            j1                  t'        j6                  dt        j                              j3                  t'        j6                  dt        j                              j5                         }t9        |      }|dkD  rt;        ||z  d      nd}|D cg c]J  }|dk  r|j<                  j?                  d      n|j<                  j?                  d      |j@                  dL }}ddd|||ddS # t        $ r t        d	dd	d
d      w xY wc c}w )z
    Fetch review count by feedback_posting_date, average reviews per day, and total reviews.
    Ensures the branch belongs to the logged-in user.
    Allows filtering by source, date range, and feedback rating (stars).
    r   Fr   r   r$   r(   r)   r'   r0   r1   r2         0Invalid rating range. Use values between 1 and 5r   Tr3   z No reviews found for this branch)total_reviewsavg_reviews_per_dayreviews_by_dater5   review_countmonthrQ   %B %Y)r5   rf   z,Review count analysis retrieved successfully)!r6   r   r7   r   r8   r9   r   r
   r:   r   rA   rC   r*   r   r@   r<   rB   rD   rS   r   r>   rT   rU   r=   rE   rF   rG   
date_trunclenrV   r5   r;   rf   )r   r   rH   r   r   r   r   r   rI   end_date_dtstart_date_dt	date_diffr6   rc   re   
total_daysrd   rK   review_lists                      rM   fetch_review_countrp      s   " XXf$$I%$,,& eg 
 #S=akmn
 	
 Xnn&#iR&88	$--j*EM"++HjAK },22I HHX%%h&8&8I&EFE X55?@LL77??{[\E*"8>Z!^zJ/F"'Ast  X55==j*UV ''

83G3G(HIPPRM9!"'(#%		
 		
 B..44V<

8//066~F Xh445Xh445SU 	 )G)GHNNvV

8//066~F Xdoogx/M/MNOXdoogx/M/MNOSU 	 _%JBLq.%
 :A>VW #
  6?"_CHH%%j1#((J[J[\cJd,,	
K  A*#6*
		 	W  	"'Afg 	Fs   ,P 8AP2P/c                 n   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        ddddg d      |r|s$t        j                         }	|	t        d      z
  }
n-	 t        j                  |d      }
t        j                  |d      }	|	|
z
  j                  }|j                  t              j                  t        j                  | k(  t        j                  dk7        }|r"|j                  t        j                  |k(        }|j                  t        j                   j#                  |
|	            }|Q|O|dk  s
|dkD  s||kD  rt        d	dd	dd      |j                  t        j                  j#                  ||            }|j%                  t'        j(                  t        j                              j+                         }|s
ddddg ddS |dk  r|j%                  t        j                   j-                  d      t'        j(                  t        j                        j-                  d            j/                  t        j                         j1                  t        j                         j3                         }n|j%                  t'        j4                  dt        j                         j-                  d      t'        j(                  t        j                        j-                  d            j/                  t'        j4                  dt        j                               j1                  t'        j4                  dt        j                               j3                         }|D cg c]T  }|dk  r|j6                  j9                  d      n|j6                  j9                  d      t;        |j<                  d      dV }}dddt;        |d      |ddS # t        $ r t        d	dd	d
d      w xY wc c}w )z
    Fetch average feedback rating by feedback_posting_date and overall average rating.
    Ensures the branch belongs to the logged-in user.
    Allows filtering by source, date range, and feedback rating (stars).
    r   Fr   r   r$   r(   r)   r'   r0   r1   r2   Nr`   ra   rb   Tr3   z)No feedback ratings found for this branchr   )overall_avg_ratingfeedback_ratings_by_dater5   
avg_ratingrg   rh   rQ   )r5   rt   z7Average feedback rating analysis retrieved successfully)r6   r   r7   r   r8   r9   r   r
   r:   r   rA   rC   r*   r   rD   r@   r<   rB   rS   r   avgrU   r=   rE   rF   rG   ri   r5   r;   rV   rt   )r   r   rH   r   r   r   r   r   rI   rk   rl   rm   r6   rr   rs   rK   feedback_lists                    rM   fetch_feedback_ratingrw   @  s   " XXf$$I%$,,& eg 
 #S=akmn
 	
 Xnn&#iR&88	$--j*EM"++HjAK },22I HHX%%i'  D(E
 X55?@LL77??{[\E*"8>Z!^zJ/F"'Ast  X55==j*UV ,,TXXh6N6N-OPWWYB&',.	
 	
 B..44V<11288F Xh445Xh445SU 	! )G)GHNNvV11288F Xdoogx/M/MNOXdoogx/M/MNOSU 	!  ,
  6?"_CHH%%j1#((J[J[\cJd2	
M  L"'(:A">(5
	 Q  	"'Afg 	@s   ,P %AP2P/c                 H   |j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        ddddd      |r|sSt        j                         j                  d      }t        j                         t        d      z
  j                  d      }|j                  t        j                         j                  t        j                  d	k(        j                  d	      t        j                         j                  t        j                  d
k(        j                  d
      t        j                         j                  t        j                  dk(        j                  d      t        j                  t        j                         j                  d            j                  t        j                  | k(        }	|r"|	j                  t        j"                  |k(        }	|r^|r\	 t        j$                  |d      }t        j$                  |d      }|	j                  t        j&                  j)                  ||            }	|Q|O|dk  s
|dkD  s||kD  rt        ddddd      |	j                  t        j,                  j)                  ||            }	|	j                         }
|
r|
j.                  dk(  r	dddddidS |
j0                  xs d|
j.                  z  }|
j2                  xs d|
j.                  z  }|
j4                  xs d|
j.                  z  }||z
  d|z  z   dz   dz  }t7        dt9        |d            dz  }ddddt;        |d      idS # t*        $ r t        ddddd      w xY w)z
    Calculate the overall sentiment score for a given branch.
    Ensures the branch belongs to the logged-in user.
    Allows filtering by source, date range, and feedback rating (stars).
    r   Fr   r2   r$   r'   r(   r)   r,   r-   r.   totalr0   r1   r`   ra   rb   r   Tr3   r4   sentiment_scorer   g      ?rQ   rP   z'Sentiment score calculated successfully   )r6   r   r7   r   r8   r9   r   r
   r:   r;   r   r   r>   r   r?   r=   rT   r@   rA   r<   rB   rC   rD   ry   r,   r-   r.   maxminrV   )r   r   rH   r   r   r   r   r   rI   r6   rZ   positive_fracnegative_frac
mixed_fracrz   s                  rM   fetch_sentiment_scorer     sM   " XXf$$V%5%5%BFNNVZVbVbDbciikF#S=ab
 	
 X>>#,,Z8nn&);;EEjQ
 HH

H..*<=CCJO

H..*<=CCJO

H..'9:@@I

8''(..w7	
 fX9,- 
 X55?@ h	!**:zBJ((:>HLL!?!?!G!G
T\!]^E *"8>Z!^zJ/F"'Ast  X55==j*UV [[]N ^11Q6@&*	
 	
 $,,1^5I5IIM#,,1^5I5IIM &&+!~/C/CCJ &5#
:JKaOSTTO As?A67<O <"E/1$=>	 M  	"'Afg 	s   AN N!)NNNNN)#sqlalchemy.ormr   fastapir   r   typingr   r   r   r	   r
   
sqlalchemyr   src.apps.feedback.modelsr   r   src.apps.feedback.schemasr   r   src.apps.datasource.modelsr   src.apps.stores.modelsr   src.utils.dbr   src.apps.auth.controllerr   r   intstrrN   r^   rp   rw   r        rM   <module>r      sf   " * , ,   3 J 1 )  5 (
 @D@DBFSSS/7}SS08S S 3;3-Sp @D@DBFYYY/7}YY08Y Y 3;3-YB ! $" $ $xxx SM	x
 x smx x x@ ! $" $ $ttt SM	t
 t smt t tx ! $" $ $[[[ SM	[
 [ sm[ [ [|9r   