
    i8                     \   d Z ddlmZ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 dd
lmZ ddlmZ ddlmZ  ej(                  e      Z e	j.                  ddg      ed               Z e	j.                  ddg      ed               Z e	j.                  ddg      ed               Zy)zV
Smart Matching API Routes
Exposes AIService.smart_job_matching() and related methods
    )jsonifyrequest)login_requiredcurrent_userN   )matching_bp   )	AIService)Job)User)Rating)dbz/jobs-for-meGET)methodsc                     	 t         j                  dk7  rt        ddi      dfS t        j                  j                  ddt              } t        | d      } t        j                  t         j                  | 	      }t        |t        |      t         j                  d
      dfS # t        $ r:}t        j                  dt        |              t        ddi      dfcY d}~S d}~ww xY w)z@Get recommended jobs for the current worker based on AI matchingworkererrorz(Only workers can get job recommendations  limit   type   )r   )matchestotal	worker_id   zError in jobs-for-me: z!Failed to get job recommendations  N)r   roler   r   argsgetintminr
   smart_job_matchingidlen	Exceptionloggerr   str)r   r   es      !app/blueprints/matching/routes.pyjobs_for_mer,      s    L(G%OPQSVVV  !# 6E2..|eL\%
  	 	  L-c!fX67!DEFKKLs#   !B# A>B# #	C&,/C!C&!C&z/workers-for-job/<int:job_id>c                   	 	 t         j                  j                  |       }|st        ddi      dfS t        j
                  dk(  rt        ddi      dfS t        j                  j                  ddt        	      }t        |d
      }t        j                  j                  dd      j                         }g }|D ]  	d}g }	j                  r|j                  rt        |j                  d      r$|j                  j                   j#                         n"t%        |j                        j#                         }	j                  j#                         |v s|	j                  j#                         v r|dz  }|j'                  d       	j(                  r|j(                  r	j(                  j#                         |j(                  j#                         k(  r|d
z  }|j'                  d       nPt+        	fd|j(                  j#                         j-                         D              r|dz  }|j'                  d       	j.                  r4	j.                  dkD  r%|d
z  }|j'                  d	j.                   d       n 	j.                  r	j.                  dkD  r|dz  }	j0                  r3	j0                  dkD  r$|d
z  }|j'                  	j0                   d       n 	j0                  r	j0                  dkD  r|dz  }|dkD  sE|j'                  	j2                  	j4                   d	j6                   	j                  	j(                  	j.                  rt9        	j.                        nd	j0                  xs d||	j:                  d	        |j=                  d d       t        |d| t?        |d|       | d       d!fS # t@        $ r:}tB        jE                  d"t%        |              t        dd#i      d$fcY d}~S d}~ww xY w)%z*Get recommended workers for a specific jobr   Job not found  r   z0Only contractors can view worker recommendationsr   r   r   r   r   F)r   
is_deletedr   name(   zTrade matchzSame locationc              3   V   K   | ]   }|j                   j                         v  " y w)N)locationlower).0arear   s     r+   	<genexpr>z"workers_for_job.<locals>.<genexpr>O   s#     bT!6!6!88bs   &)
   zNearby locationg      @zHigh rated ()g      @z jobs completed N)	r   r1   primary_trader4   average_ratingjobs_completedmatch_scorematch_reasonsprofile_picturec                     | d   S )Nr?    )xs    r+   <lambda>z!workers_for_job.<locals>.<lambda>n   s    1]#3     T)keyreverse)r   r   job_idr   zError in workers-for-job: z$Failed to get worker recommendationsr   )#r   queryr!   r   r   r   r   r    r"   r#   r   	filter_byallr<   categoryhasattrr1   r5   r)   appendr4   anysplitr=   r>   r%   
first_name	last_namefloatrA   sortr&   r'   r(   r   )
rI   jobr   workersr   scorereasonsjob_catr*   r   s
            @r+   workers_for_jobr[   +   s   IOiimmF#G_56;; (G%WXY[^^^  !# 6E2 **&&H&GKKM -	FEG ##7>s||V7T#,,++113Z]^a^j^jZkZqZqZs''--/7:gI]I]IcIcIe>eRKENN=1 3<<??((*cll.@.@.BBRKENN?3bS\\EWEWEYE_E_EabbRKENN#45 $$)>)>)Df.C.C-DAFG&&6+@+@3+F $$)>)>)B&"7"7!8HI&&6+@+@1+Dqy!'%00163C3C2DE%+%9%9 &FLF[F[eF,A,A&Bae&,&;&;&@q#(%,'-'='=
  
G-	^ 	3TBv%)
  	 	  O1#a&:;!GHI3NNOs0   /O !O J(O ?CO 	P
/O?9P?Pz/price-suggestion/<int:job_id>c                 *   	 t         j                  j                  |       }|st        ddi      dfS |j                  r:t        |j                  d      r$|j                  j                  j                         nd|j                  xs d|j                  xs dt        |dd      xs dd	}t        j                  |      }t        | |d
      dfS # t        $ r:}t        j                  dt!        |              t        ddi      dfcY d}~S d}~ww xY w)z)Get AI-powered price suggestion for a jobr   r.   r/   r1   general urgencynormal)tradedescriptionr4   r_   )rI   recommendationr   zError in price-suggestion: zFailed to get price suggestionr   N)r   rJ   r!   r   rM   rN   r1   r5   rb   r4   getattrr
   price_recommendationr'   r(   r   r)   )rI   rV   job_detailsrc   r*   s        r+   price_suggestionrg   {   s   IiimmF#G_56;; 36,,73<<Y_C`S\\&&,,.fo??0b*sIx8DH	
 #77D,
   	
  I23q6(;<!ABCSHHIs#   /C BC 	D/DDD)__doc__flaskr   r   flask_loginr   r   loggingr^   r   services.ai_servicer
   
models.jobr   models.userr   models.ratingr   
extensionsr   	getLogger__name__r(   router,   r[   rg   rC   rF   r+   <module>rt      s    # 4   ,   # 			8	$ >E73L  4L, 2UGDKO  EKO\ 3eWEI  FIrF   