
    i9<              
          d Z ddlmZmZmZmZ ddlmZmZ ddl	m
Z
 ddlmZmZ ddlmZ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 ddlmZ ddl m!Z!  ede"d      Z#e#jI                  ddg      ede%deee&ef   e%f   fd              Z'e#jI                  ddg      ede%deee&ef   e%f   fd              Z(e#jI                  ddg      de%deee&ef   e%f   fd       Z)e#jI                  ddg      eejT                  de%deee&ef   e%f   fd                     Z+d  Z,e#j[                  d!      d"        Z.y#)$zz
Rating routes for contract completion and user feedback.
Handles rating submission, validation, and user rating updates.
    )	Blueprintrequestjsonifycurrent_app)login_requiredcurrent_user)func)datetimetimezone)DictAnyTuple)dblimiterContract)Rating)User)validate_rating_data)award_points)check_user_achievements)notify_rating_receivedratingz/api/contracts)
url_prefixz/<int:contract_id>/ratePOST)methodscontract_idreturnc                    	 t        j                         }|sddidfS t        j                  j	                  |       }|sddidfS |j
                  dk7  rddidfS t        j                  |j                  k(  r|j                  }|j                  }d}n>t        j                  |j                  k(  r|j                  }|j                  }d	}ndd
idfS t        j                  j                  | |      j                         }|rddidfS d|v }|rVt        |j	                  dd            }|rdnd}	t        | |||	|d|j	                  dd      j                         dd       }
nt        |      }|d   s	d|d   idfS |j	                  dd      |j	                  dd      |j	                  dd      |j	                  dd      g}|D cg c]
  }|dkD  s	| }}|sdd idfS t!        |      t#        |      z  }	t        | ||t%        |	d      |j	                  d      |j	                  d      |j	                  d      |j	                  d      |j	                  dd      j                         dd d!"
      }
t&        j(                  j+                  |
       t,        j                  j	                  |      }|rpt        j                  j                  |#      j/                         }|r@t!        d$ |D              |	z   }t#        |      d!z   }t%        ||z  d      }||_        ||_        t&        j(                  j5                          	 t,        j                  j	                  |      }|r|j6                   d%|j8                   nd&}t;        |d'd(|        }t=        ||	|||
j                  )       t>        j@                  jC                  d*|        	 tI        |d,| -       |	dk\  rtI        |d.| -       tK        |      }tK        |      }t>        j@                  jC                  d/| d0| d1|	dk\  rd2nd d3| d4| 
       t>        j@                  jC                  d6|  d7| d8| d9|	        dd:|	|
jL                  |
jN                  |j	                  d      |j	                  d      |j	                  d      |j	                  d      |
jP                  d;|rtS        |j0                        nd|r|j2                  ndd<d=fS c c}w # tD        $ r-}t>        j@                  jG                  d+|        Y d}~`d}~ww xY w# tD        $ r-}t>        j@                  jG                  d5|        Y d}~,d}~ww xY w# tD        $ rY}t&        j(                  jU                          t>        j@                  jG                  d>tW        |              dd?idfcY d}~S d}~ww xY w)@a  
    Submit a rating for a completed contract.

    Args:
        contract_id: The ID of the contract to rate

    Returns:
        JSON response with success status and updated user average

    Expected JSON payload:
    {
        "quality": 5,           # 1-5 rating for work quality
        "timeliness": 4,        # 1-5 rating for timeliness
        "communication": 5,     # 1-5 rating for communication
        "professionalism": 4,   # 1-5 rating for professionalism
        "comment": "Great work!" # Optional comment
    }
    errorzNo data providedi  Contract not found  	completedz!Can only rate completed contracts
contractorworkerz$Not authorized to rate this contract  r   rater_idz$You have already rated this contracti  positiveTg      @g      ?   comment N  )r   r(   rated_idoverall_scoreis_positiverating_versionreview_textvalidmessagequalityr   
timelinesscommunicationprofessionalismz(At least one rating category is required   )
r   r(   r.   r/   quality_scorereliability_scorecommunication_scoreprofessionalism_scorer2   r1   r.   c              3   4   K   | ]  }|j                     y wNr/   .0rs     )app/blueprints/contracts/rating_routes.py	<genexpr>z submit_rating.<locals>.<genexpr>   s     "Iq1??"I    Someonetitlez
Contract #)user_idr   reviewer_name	job_title	review_idz!Rating notification sent to user zNotification error: rating_given)related_contract_idfive_star_receivedzGamification: Rater z earned 10 points. Ratee z earned 2   z' bonus points. New achievements: Ratee=z, Rater=zGamification error: zRating submitted: Contract z, Rater z rated z with zRating submitted successfully)overall_ratingr0   r1   r5   r6   r7   r8   r+   )successr4   r   ratee_new_averageratee_total_reviews   zError submitting rating: Internal server error),r   get_jsonr   querygetstatusr   idcontractor_id	worker_idr   	filter_byfirstboolstripr   sumlenroundr   sessionaddr   allaverage_ratingtotal_reviewscommit
first_name	last_namegetattrr   r   loggerinfo	Exceptionr    r   r   r0   r1   r2   floatrollbackstr)r   datacontractr(   ratee_id
rater_roleexisting_rating	is_thumbsr0   rS   
new_ratingvalidation_resultindividual_ratingsrD   valid_ratingsrateeuser_ratingstotal_ratingtotal_countnew_averagerater
rater_namerM   notification_errornew_achievementsrater_achievementsgamification_errores                               rE   submit_ratingr      s   *k7!/0#55>>%%k212C77??k)@A3FF ??h444--H))H%J__ 2 22))H--H!JCDcII ,,00# 1 
 %' 	
 CDcII $&	txx
D9:K$/SSN'!!,'  HHY399;DSAJ !5T :$W-!29!=>CC A&q)!,*A.	" );D1a!eQDMD !KLcQQ /#m2DDN'!!#NA6"hhy1"&((<"8$(HH_$=&*hh/@&A HHY399;DSA J 	

z" 

x(!<<1181DHHJL""IL"IINZ!,/!3#L;$>B (3$&1#


	RJJNN8,EDIE,,-Qu.?@yJ  'Z}3MNI" %(#$-- ##&Gz$RS	R>{S $X';Q\]  7x@ "9!B##&xj 1!
(31F2A*N O++;*<HEWDXZ 	)+ 7JghZvn5EG	
 6"0)55",";";88I."hh|4!%/!:#'88,=#>%11	 AFu';';!<4:?5#6#6T
  	s En  	R$$';<N;O%PQQ	R2  	R$$';<N;O%PQQ	R4  7


  #<SVH!EF013667s   U, &U, U, A5U, 6U, A4U, <A
U, 
S5S5	U, E!U, B
S: A,T3 8B<U, 5U, :	T0"T+%U, +T00U, 3	U)<"U$U, $U))U, ,	W5AW	W	Wz/<int:contract_id>/ratingGETc                    	 t         j                  j                  |       }|sddidfS t        j                  |j
                  |j                  fvrddidfS t        j                  j                  | t        j                        j                         }|sd|j                  dk(  d	d
fS t        |j                        |j                  |j                  |j                  |j                   |j"                  |j$                  j'                         ddd	d
fS # t(        $ r;}t*        j,                  j/                  dt1        |              ddidfcY d}~S d}~ww xY w)z
    Get rating information for a specific contract.

    Args:
        contract_id: The ID of the contract

    Returns:
        JSON response with rating data or null if no rating exists
    r    r!   r"   z-Not authorized to view this contract's ratingr&   r'   Nr#   )r   can_rate   )rS   r5   r6   r7   r8   r+   
created_atFzError getting contract rating: rX   r-   )r   rZ   r[   r   r]   r^   r_   r   r`   ra   r\   rs   r/   r:   r;   r<   r=   r2   rating_date	isoformatrr   r   rp   r    ru   )r   rw   r   r   s       rE   get_contract_ratingr      s_   !7>>%%k212C77 ??8#9#98;M;M"NNLMsRR ''#!__ ( 
 %' 	
 ";0NOQTTT #((<(<"=!//$66!'!;!;#)#?#?!--$00::< 
  	  7  #B3q6(!KL013667s0   &D -D AD *A+D 	E0EEEz/users/<int:user_id>/ratingsrK   c                    	 t         j                  j                  |       }|sddidfS t        j                  j                  ddt
              }t        t        j                  j                  ddt
              d	      }t        j                  j                  | 
      j                  t        j                  j                               }|j                  ||d      }g }|j                  D ]*  }t         j                  j                  |j                        }|j                  |j                   rt#        |j                         nd|j$                  t'        |d      r|j(                  nd|j*                  |j,                  |j.                  |j0                  |j2                  |j                  j5                         |r|j                  nd|r|j6                   d|j8                   nd|r|j:                  ndd|j<                  d}	|j?                  |	       - t        j                  j                  | 
      jA                         }
|
r+tC        d |
D              }tE        |tG        |
      z  d      }nd}dddddd}d}d}|
D ]e  }|j                   r&tE        |j                         }||v r||xx   dz  cc<   t'        |d      sB|j$                  O|dz  }|j$                  sa|dz  }g |dkD  rtE        ||z  dz  d      nd}|j                  |j6                   d|j8                   |j:                  ||tG        |
      d|||||jH                  |jJ                  |jL                  |jN                  |jP                  |jR                  dddfS # tT        $ r;}tV        jX                  j[                  dt]        |              ddid fcY d}~S d}~ww xY w)!a@  
    Get all ratings for a specific user with pagination.

    Args:
        user_id: The ID of the user to get ratings for

    Query Parameters:
        page: Page number (default: 1)
        per_page: Items per page (default: 10, max: 50)

    Returns:
        JSON response with user ratings and pagination info
    r    zUser not foundr"   pager9   )typeper_page
   rR   r>   F)r   r   	error_outNr1   rH   Unknown)r]   namerole)r]   rS   r0   r1   r5   r6   r7   r8   r+   r   r   r   c              3   4   K   | ]  }|j                     y wr@   rA   rB   s     rE   rF   z#get_user_ratings.<locals>.<genexpr>I  s     D1qDrG   r*   g        r   )r9   r*            r0   d   )r]   r   r   rj   positive_percentagerk   )r   r   totalpageshas_nexthas_prevnext_numprev_num)userratingsrating_distribution
paginationr   zError getting user ratings: rX   r-   )/r   rZ   r[   r   argsintminr   r`   order_byr   descpaginateitemsr(   r]   r/   rs   r0   hasattrr1   r:   r;   r<   r=   r2   r   rm   rn   r   r   appendri   rd   rf   re   r   r   r   r   r   r   rr   r   rp   r    ru   )rK   r   r   r   ratings_queryratings_paginatedratings_datar   r   rating_dataall_ratingsr   rj   r   positive_countthumbs_countrounded_ratingr   r   s                      rE   get_user_ratingsr     s   \7zz~~g&-.33 ||4w||''
BS'A2F ...@II&J\J\JaJaJcd)22 3 
 '-- 	-FJJNN6??3E iiAGAUAU%(<(<"=[_%11;B6K[;\&"7"7bc!//$66!'!;!;#)#?#?!--$00::<&+%((GLu//0%//1BCR[*/EJJT
  &11!K$ ,-	-2 ll,,g,>BBDDDDL"<#k2B#BAFN N #$aA!<! 	(F##!&v';';!<!%88'71<7v}-&2D2D2P!%%"a'N	( R^`aQae^l%BS%H1Mgk gg??+1T^^,<=		"0':!$[!1 $#6$*00*00-66-66-66-66	
* + 	.  7  #?Ax!HI013667s6   &N JN N N &B*N 	O0O
OOz/<int:contract_id>/statusc                    ddl m} |j                  j                  |       }t        j
                  |j                  |j                  fvrddidfS |j                  |j                  |j                  ddt        j                  d      z  fS )	zQuick status check for contractr   r   r    Unauthorizedr&   )r\   contractor_ratedworker_ratedr   r"   )app.models.contractr   rZ   
get_or_404r   r]   r^   r_   r\   r   r   	rating_bperrorhandler)r   r   rw   s      rE   get_contract_statusr   {  s    
 -~~((5Hx55x7I7IJJ(#-- //$55 -- 9!!#&&	' '    c                     ddidfS )z$Handle 404 errors for rating routes.r    zResource not foundr"    r    s    rE   	not_foundr     s    )*C//r   r-   c                 J    t         j                  j                          ddidfS )z$Handle 500 errors for rating routes.r    rX   r-   )r   rg   rt   r   s    rE   internal_errorr     s%     JJ,-s22r   N)/__doc__flaskr   r   r   r   flask_loginr   r   
sqlalchemyr	   r
   r   typingr   r   r   app.extensionsr   r   r   r   app.models.ratingr   app.models.userr   app.utils.validatorsr   app.utils.gamificationr   app.config.achievementsr   app.utils.notification_helpersr   __name__r   router   ru   r   r   r   exemptr   r   r   r   r   r   rE   <module>r      s  
 ; : 4  ' # # & ( $   5 / ; Ah5EF	 *VH=~7s ~7uT#s(^S-@'A ~7  >~7B ,ug>+7S +7U4S>33F-G +7  ?+7\ /%Aj7c j7eDcNC,?&@ j7 Bj7^ ,ug>'S 'U4S>33F-G '   ?'0
 3 3r   