o
     i'                  
   @   s  d Z ddlZddlZddlmZmZ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mZ zddlmZmZmZmZmZmZmZmZmZ W n1 eyy   ddlZejej ej!e" ddlmZmZmZmZmZmZmZmZmZ Y nw ej#ej$dd	 d
Z%e&dZ'G dd deZ(G dd deZ)G dd deZ*e	dde%dZ+e+j,edgddgdgd e+j-dddgdeddddfd e.fd!d"Z/e+j-d#d$dgdeddd%fd&e)d e.fd'd(Z0e+j-d)d*dgdeddd%fd e.fd+d,Z1e+j2d-d.d/gdeddd%fd e.fd0d1Z3e+j2d2e*d3d/gd4eddd%fd e.fd5d6Z4e+j2d7d8d9gdd:d; Z5e+j6d<d=d9gdeddd%fd e.fd>d?Z7e+j2d@dAdBgddCdD Z8dS )Eut  
Question Bank Competency Evaluation — FastAPI Layer
===================================================

Enterprise-grade HTTP API for the LMS Question Bank Competency feature.

  Phase 1 — TRAIN:
      1. POST /train/{client_id}/start
      2. POST /train/{client_id}/question-bank-batch
      3. POST /train/{client_id}/finalize-questions

  Phase 2 — REPORT:
      GET  /report/{client_id}                         → Full competency result (for cron/admin)
      GET  /report/status/{client_id}                  → Training status check

All data is client-isolated — no cross-contamination between organisations.
    N)AnyDictListOptional)FastAPIHTTPExceptionPathstatus)CORSMiddleware)	BaseModelField)	get_training_statusget_question_bank_resultlist_all_clientsdelete_client_datainitialize_client_storeaccumulate_question_bankfinalize_question_bankmark_training_failedTrainingStatusz4%(asctime)s | %(levelname)s | %(name)s | %(message)s)levelformatz3.0.0-LIGHTassessment_report_apic                   @   s   e Zd ZU edddZeed< edddZeed< edddZe	ed< ed	d
dZ
ee ed< ed	ddZee ed< G dd dZdS )QuestionBankItem.z%Unique encrypted question identifier.descriptionidzFull question content.questionTextzQuestion format type.questionType z,Category of the question for classification.categoryNamez#Available options for the question.questionOptionc                   @      e Zd ZdZdS )zQuestionBankItem.ConfigignoreN__name__
__module____qualname__extra r)   r)   p/var/www/eduai.edurigo.com/assessment_competency_evaluation/testing/assessment_competency_evaluation_fast_api.pyConfigN       r+   N)r%   r&   r'   r   r   str__annotations__r   r   intr    r   r!   r+   r)   r)   r)   r*   r   H   s   
 r   c                   @   s8   e Zd ZU dZedddZee ed< G dd dZ	dS )	QuestionBankBatchRequestz*Payload for a batch of question bank data..zBatch of question bank items.r   question_bankc                   @   r"   )zQuestionBankBatchRequest.Configr#   Nr$   r)   r)   r)   r*   r+   U   r,   r+   N)
r%   r&   r'   __doc__r   r1   r   r   r.   r+   r)   r)   r)   r*   r0   R   s   
 r0   c                   @   sf   e Zd ZU edddZeed< edddZeed< edddZ	e
ed< edd	dZeeef ed
< dS )StatusResponse.zTrue if client exists.r   r	   zStatus message.messagezThe client ID.	client_idzTraining metadata.trainingN)r%   r&   r'   r   r	   boolr.   r4   r-   r5   r/   r6   r   r   r)   r)   r)   r*   r3   ]   s
   
  r3   zQuestion Bank Competency APIu,  ## LMS Question Bank Competency API

Streamlined competency mapping for question banks.

### Workflow

1. `/train/{id}/start` — Initialize
2. `/train/{id}/question-bank-batch` — Send data
3. `/train/{id}/finalize-questions` — Classify & Save
4. `/report/{id}` — Get Results (used by PHP cron))titler   version*T)allow_originsallow_credentialsallow_methodsallow_headersz/train/{client_id}/startz!Initialize question bank trainingTraining)summarytags.   zUnique integer client ID.)ger   r5   c              
      st   t d|  d zt| }dd|  d| |dW S  ty9 } zt d|  d|  td	t|d
d}~ww )z4Initializes the pipeline for question bank training.POST /train/z/startTz.Question bank training initialized for client .r	   r4   r5   r6   z&Failed to initialize store for client :   status_codedetailN)loggerinfor   	Exception	exceptionr   r-   )r5   metaexcr)   r)   r*   start_training_endpoint   s   	
rR   z&/train/{client_id}/question-bank-batchz(Accumulate a batch of question bank data)rC   payloadc              
      s   t d| dt| j  zdd | jD }t||}dd|d |dW S  tyH } zt d	| d
|  tdt	|dd}~ww )z*Accumulates question bank data in batches.rD   z/question-bank-batch | count=c                 S   s   g | ]}|  qS r)   )
model_dump).0qr)   r)   r*   
<listcomp>   s    z'question_bank_batch.<locals>.<listcomp>TzBatch accumulated. Total: total_questions)r	   r4   r5   z Failed to accumulate for client rG   rH   rI   N)
rL   rM   lenr1   r   getrN   rO   r   r-   )rS   r5   q_bankresultrQ   r)   r)   r*   question_bank_batch   s   

r]   z%/train/{client_id}/finalize-questionsz Finalize question classificationc              
      s   t d|  d z t| }d|v rtd|d ddd|  d| |d	d
dW S  tyI } zt d|  d|  tdt|dd}~ww )zEProcesses all accumulated questions and generates competency mapping.rD   z/finalize-questionserrori  rI   TzTraining completed for client rE   rX   r   )r	   r4   r5   rX   zFailed to finalize for client rG   rH   N)rL   rM   r   r   rZ   rN   rO   r-   )r5   r\   rQ   r)   r)   r*   finalize_questions_endpoint   s    	

r_   z/report/{client_id}z;Retrieve full question competency result (used by PHP cron)Reportc                    sz   t d|   t| }|stddd|dtjkr*dd|d | |dS t| }|s6td	d
ddd| |dS )ae  
    Returns the question_bank_result.json for the client.
    Used by the PHP cron job (trainUserAttemptData) to get the
    competency mapping for all questions.
    Returns:
      - status: bool
      - result.questions: {question_id: {competency, ...}}
      - result.competency_summary: {competency_name: count}
      - result.total_questions: int
    zGET /report/  Client not found.rI   r	   FzTraining status: rF   rH   zResult file missing.TzResults retrieved.)r	   r4   r5   r\   )rL   rM   r   r   rZ   r   	COMPLETEDr   )r5   status_metar\   r)   r)   r*   
get_report   s&   re   z/report/status/{client_id}zCheck training status)response_modelr@   rA   c                    s:   t | }|d u rtdddtdd|d | |dS )Nra   rb   rI   TzStatus: r	   rF   )r   r   r3   rZ   )r5   rP   r)   r)   r*   check_status   s   	rg   z/clientszList all clients
Managementc                      s   dt  dS )NT)r	   clients)r   r)   r)   r)   r*   list_clients  s   rj   z/client/{client_id}zDelete client datac              
      sL   zt | rdddW S tddd ty% } ztdt|dd }~ww )NTzDeleted.)r	   r4   ra   z
Not found.rI   i  )r   r   RuntimeErrorr-   )r5   rQ   r)   r)   r*   delete_client  s   rl   z/healthzHealth checkSystemc                      s   dt dS )Nok)r	   r9   )VERSIONr)   r)   r)   r*   health_check"  s   
rp   )9r2   osloggingtypingr   r   r   r   fastapir   r   r   r	   fastapi.middleware.corsr
   pydanticr   r   $assessment_report_analysis_processorr   r   r   r   r   r   r   r   r   ImportErrorsyspathappenddirnameabspath__file__basicConfigINFOro   	getLoggerrL   r   r0   r3   appadd_middlewarepostr/   rR   r]   r_   rZ   re   rg   rj   deleterl   rp   r)   r)   r)   r*   <module>   s    00




'

	