Ë
    ‡bjB%  ã                  óX  — d Z ddlmZ ddlZddlmZmZ ddlmZmZm	Z	m
Z
 ddlmZmZmZ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  ee«      Z edg¬«      Zdd„ZejA                  de¬«       ee«      fdd„«       Z!ejE                  de¬«       ee«      fdd„«       Z#ejE                  de¬«       ee«      fdd„«       Z$ejE                  de¬«       ee«      fdd„«       Z%ejA                  de¬«       ee«      fd d„«       Z&ejE                  de¬«      	 	 	 	 d!d„«       Z'y)"uÒ  
routes/coding.py â€” CodingService API
POST /api/coding/run          â€” AI Compiler (run code, get errors/output)
POST /api/coding/submit       â€” Submit a single answer (AI evaluated)
POST /api/coding/final-submit â€” Final submission of all answers
GET  /api/coding/questions    â€” Get question list
GET  /api/coding/history      â€” Get candidate's submission history
POST /api/admin/coding/review/{id} â€” Admin: set final marks

Each submit and final-submit logs an "API SPEC SAMPLE" record so the
backend dev can use those JSON snapshots verbatim as the contract for
the upstream coding-results service. The same payloads are mirrored to
data/by_access_key/{access_key}/coding_submit.json and coding_final.json.
é    )ÚannotationsN)ÚdatetimeÚtimezone)Ú	APIRouterÚDependsÚHTTPExceptionÚstatus)ÚRunCodeRequestÚRunCodeResponseÚSubmitCodeRequestÚSubmitCodeResponseÚFinalSubmitRequestÚFinalSubmitResponseÚSuccessResponse)Úcoding_service)Úget_current_candidate)Ú
_audit_dirÚ_log_outgoing_request)Ú
get_loggerÚcoding)Útagsc                ó†  — | sy	 t        | «      |› d�z  }g }|j                  «       r9	 t        j                  |j	                  d¬«      «      }t        |t        «      s|g}t        |«      }| |d<   t        j                  t        j                  «      j                  «       |d<   |j                  |«       |j                  t        j                   |dt"        d¬	«      d¬«       t$        j'                  d
| |t)        |«      «       y# t        $ r g }Y Œ²w xY w# t        $ r }t$        j+                  d|«       Y d}~yd}~ww xY w)zðAppend a record to data/by_access_key/{access_key}/{kind}.json.

    Best-effort: never raises. Used to give the backend dev a real,
    per-candidate JSON file that exactly mirrors what the future
    upstream API will need to accept.
    Nz.jsonzutf-8)ÚencodingÚ
access_keyÚsaved_até   F)ÚindentÚdefaultÚensure_asciiu&   [coding] mirrored â†’ %s/%s (%d total)z$[coding] mirror failed (ignored): %s)r   ÚexistsÚjsonÚloadsÚ	read_textÚ
isinstanceÚlistÚ	ExceptionÚdictr   Únowr   ÚutcÚ	isoformatÚappendÚ
write_textÚdumpsÚstrÚlogÚinfoÚlenÚwarning)r   ÚkindÚrecordÚpathÚexistingÚfullÚexcs          úh/Users/priyanka/Documents/AI_Agent_Assessment/pepole_hub_candidate/people_hub_candidate/routes/coding.pyÚ_mirror_to_access_keyr:   (   s  € ñ ØðAÜ˜*Ó%¨4¨&°¨Ñ6ˆØˆØ�;‰;Œ=ðÜŸ:™: d§n¡n¸g nÓ&FÓG�Ü! (¬DÔ1Ø (˜z�Hô �F‹|ˆØ'ˆˆ\ÑÜ%Ÿ\™\¬(¯,©,Ó7×AÑAÓCˆˆZÑØ�‰˜Ôà�‰Ü�J‰J�x¨´3ÀUÔKØð 	ô 	
ô 	�‰Ð9¸:ÀtÌSÐQYË]Õ[øô ò Ø’ðûô ò AÜ�‰Ð:¸C×@Ñ@ûðAús;   …#D ©8D Á!B$D ÄDÄD ÄDÄD Ä	E Ä D;Ä;E z/api/coding/questions)Úresponse_modelc                ó>   — t        t        j                  «       ¬«      S )z4Return the coding question list (without solutions).©Údata)r   r   Úget_questions)Ú_s    r9   r?   r?   K   s   € ô ¤× <Ñ <Ó >Ô?Ð?ó    z/api/coding/runc                óþ   — | j                   j                  «       st        t        j                  d¬«      ‚t        j                  | j                  | j                   | j                  ¬«      }t        |d   |d   ¬«      S )u™   
    AI Compiler: analyze code, return compiler-style errors/output.
    Does NOT provide solutions or suggestions â€” behaves like a real compiler.
    zCode cannot be empty.©Ústatus_codeÚdetail)ÚlanguageÚcodeÚquestion_idÚoutputr	   )rI   r	   )
rG   Ústripr   r	   ÚHTTP_400_BAD_REQUESTr   Úrun_coderF   rH   r   )ÚbodyÚ	candidateÚresults      r9   rL   rL   S   sm   € ð �9‰9�?‰?ÔÜÜ×3Ñ3Ø*ô
ð 	
ô
 ×$Ñ$Ø—‘Ø�Y‰YØ×$Ñ$ô€Fô
  &¨Ñ"2¸6À(Ñ;KÔLÐLrA   z/api/coding/submitc                óN  — | j                   j                  «       st        t        j                  d¬«      ‚|j                  dd«      }||j                  d«      | j                  | j                  | j                  | j                   t        j                  t        j                  «      j                  «       dœ}t        d||«       t        j                   |d   || j                  | j                  | j                  | j                   ¬«      }t#        |d||j                  d	«      |j                  d
«      |j                  d«      |j                  d«      |j                  d«      |j                  d«      dœdœ«       t%        |d	   |d
   |d   |d   |d   |d   |d   |d   ¬«      S )zõ
    Submit answer for a single question.
    AI evaluates and scores it; result stored in coding_assessment.json
    AND mirrored to data/by_access_key/{access_key}/coding_submit.json so
    the backend dev has a per-candidate audit trail.
    zSubmitted code cannot be empty.rC   r   Ú Úid)r   Úcandidate_idrH   Úquestion_textrF   rG   Úsubmitted_atÚcoding_submit)rS   r   rH   rT   rF   rG   Úsubmission_idrH   Ú	ai_resultÚai_scoreÚai_marksÚ	max_marks)rW   rH   rX   rY   rZ   r[   ©ÚrequestÚresponseÚai_feedbackrU   )rW   rH   rX   r_   rY   rZ   r[   rU   )rG   rJ   r   r	   rK   ÚgetrH   rT   rF   r   r(   r   r)   r*   r   r   Úsubmit_coder:   r   )rM   rN   r   Úspec_payloadrO   s        r9   ra   ra   i   sˆ  € ð �9‰9�?‰?ÔÜÜ×3Ñ3Ø4ô
ð 	
ð
 —‘˜|¨RÓ0€Jð
 $Ø"Ÿ™ tÓ,Ø×)Ñ)Ø×+Ñ+ØŸ™ØŸ™Ü!Ÿ™¤h§l¡lÓ3×=Ñ=Ó?ñ€Lô ˜/¨:°|ÔDä×'Ñ'Ø˜t‘_ØØ×$Ñ$Ø×(Ñ(Ø—‘Ø�Y‰Yô€Fô ˜* oØ à#ŸZ™Z¨Ó8Ø#ŸZ™Z¨Ó6Ø#ŸZ™Z¨Ó4Ø#ŸZ™Z¨
Ó3Ø#ŸZ™Z¨
Ó3Ø#ŸZ™Z¨Ó4ñ
ñ
8ô 
ô Ø˜_Ñ-Ø˜=Ñ)Ø˜Ñ%Ø˜=Ñ)Ø˜
Ñ#Ø˜
Ñ#Ø˜Ñ%Ø˜NÑ+ô	ð 	rA   z/api/coding/final-submitc                ó  — |j                  dd«      }||j                  d«      | j                  t        j                  t        j
                  «      j                  «       | j                  xs g D �cg c])  }t        |d«      r|j                  «       n
t        |«      ‘Œ+ c}dœ}t        d||«       t        j                  |d   || j                  | j                  ¬«      }t        |d||dœ«       t        d	i |¤ŽS c c}w )
uO  
    Final submission. Records completion and returns a reference number.

    The full request payload is also:
      â€¢ Logged as an "API SPEC SAMPLE" for the backend developer.
      â€¢ Mirrored to data/by_access_key/{access_key}/coding_final.json so
        each candidate's final submission is a separate, inspectable file.
    r   rQ   rR   Ú
model_dump)r   rS   Útime_used_secondsÚfinished_atÚsubmissionsÚcoding_final)rS   r   rg   re   r\   © )r`   re   r   r(   r   r)   r*   rg   Úhasattrrd   r'   r   r   Úfinal_submitr:   r   )rM   rN   r   Úsrb   rO   s         r9   rk   rk   ª   sù   € ð —‘˜|¨RÓ0€Jð (Ø&Ÿ]™]¨4Ó0Ø!×3Ñ3Ü%Ÿ\™\¬(¯,©,Ó7×AÑAÓCð ×&Ñ&Ò,¨"Ð,ó
á,�ô  ' q¨,Ô7ˆQ�\‰\Œ^¼TÀ!»WÑDØ,ñ
ñ	€Lô ˜.¨*°lÔCä×(Ñ(Ø˜t‘_ØØ×$Ñ$Ø×0Ñ0ô	€Fô ˜* nØ Øñ7ô ô
 Ñ( Ñ(Ð(ùò'
s   Á1.C<z/api/coding/historyc                óJ   — t        j                  | d   «      }t        |¬«      S )z5Get all coding submissions for the current candidate.rR   r=   )r   Úget_candidate_submissionsr   )rN   rg   s     r9   Úhistoryro   Ó   s#   € ô !×:Ñ:¸9ÀT¹?ÓK€KÜ Ô,Ð,rA   z(/api/admin/coding/review/{submission_id}c                óf   — t        j                  | |«      }|st        dd¬«      ‚t        d|¬«      S )z‡
    Admin endpoint: override AI marks with manually reviewed final marks.
    Protect this endpoint with admin JWT in production.
    i”  zSubmission not found.rC   zFinal marks updated.)Úmessager>   )r   Úset_final_marksr   r   )rW   Úfinal_marksrO   s      r9   Úadmin_reviewrt   Ü   s5   € ô ×+Ñ+¨M¸;ÓG€FÙÜ¨Ð4KÔLÐLÜÐ#9ÀÔGÐGrA   )r   r.   r3   r.   r4   r'   ÚreturnÚNone)r@   r'   )rM   r
   rN   r'   )rM   r   rN   r'   )rM   r   rN   r'   )rN   r'   )rW   r.   rs   Úint)(Ú__doc__Ú
__future__r   r!   r   r   Úfastapir   r   r   r	   Úmodels.schemasr
   r   r   r   r   r   r   Úservices.coding_servicer   Úmiddleware.auth_middlewarer   Úroutes.peoplehub_externalr   r   Úutils.loggerr   Ú__name__r/   Úrouterr:   r`   r?   ÚpostrL   ra   rk   ro   rt   ri   rA   r9   Ú<module>rƒ      st  ðñõ #Û ß 'ç =Ó =÷÷ ñ õ 3Ý <÷õ $á�Ó€á	˜˜
Ô	#€óAðF ‡�Ð#°O€ÓDÙ#Ð$9Ó:ó @ó Eð@ð ‡�Ð¨€Ó?Ù5<Ð=RÓ5Só Mó @ðMð* ‡�Ð!Ð2D€ÓEÙ;BÐCXÓ;Yó ;ó Fð;ð@ ‡�Ð'Ð8K€ÓLÙ=DÐEZÓ=[ó #)ó Mð#)ðP ‡�Ð!°/€ÓBÙ%Ð&;Ó<ó -ó Cð-ð ‡�Ð7È€ÓXðHØðHàòHó YñHrA   