o
    i9                     @   s   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Ze Zdd Zd	d
 Zdd Zdd Zdd Zdd ZdS )    )requestjsonify)connect_to_database)Prompts)chatgpt_call)closingNc                 C   s  t jdd}|r3zt|}td|   W n ty2 } ztd|  d}W Y d}~nd}~ww t }|sAtddddfS |j	d	d
}z|
d| f | }|
d| f | }|d dkr|
d| f | }i }|D ]
}	|	d ||	d < qt|  |  |  t|dddfW S |
d| f | }
|
s|  |  tddddfW S |
d }|
d }|
d }|
d }|
d }|
d }|
d }|
d }|
d  }|
d! }|
d" }|
d# }|
d$ }|
d% }|
d& }|
d' }d(d) |D }tj||||||||||||||||d*}t|}|D ]}|
d+|| ||f q|
d| f | }i }|D ]}	|	d ||	d < q3|  |  |  t|dddfW S  ty } z%td,t|  |  |  td-t| dddfW  Y d}~S d}~ww ).z]
    Get diagnostics for a visit - supports report context from uploaded medical reports
    report_contextNz.Report context received for diagnostics visit zError parsing report_context: zDatabase connection errortruemessageerror  T
dictionaryaa  
            SELECT 
                pc.possible_causes AS possible_causes
            FROM 
                possible_causes pc
            RIGHT JOIN 
                possible_causes_by_doctor pcd
            ON 
                pc.visits_id = pcd.visits_id AND pc.id = pcd.possible_causes
            WHERE 
                pc.visits_id = %s;
        zESELECT COUNT(*) AS total_count FROM diagnostics WHERE visits_id = %s;total_countr   z/SELECT * FROM diagnostics WHERE visits_id = %s;diagnosticsidFdatar      a  
                SELECT 
                    p.id as patient_id,
                    p.fullname AS patient_name,
                    p.gender,
                    p.age,
                    p.fk_doctor,
                    p.allergies,
                    p.medications,
                    v.reasonforvisit AS reasonForConsultation,
                    v.height,
                    v.weight,
                    v.symptoms,
                    v.glucoselevel AS glucoseLevel,
                    v.bloodpressure AS bp,
                    p.tobaccouse AS tobaccoUse,
                    p.alcoholconsumption AS alcoholConsumption,
                    p.dietandexercisehabits AS dietAndExerciseHabits
                FROM 
                    patients p
                JOIN 
                    visits v ON p.id = v.fk_patients
                WHERE 
                    v.id = %s;
            zPatient not found  
patient_idpatient_namegenderage	fk_doctor	allergiesmedicationsreasonForConsultationheightweightglucoseLevelbp
tobaccoUsesymptomsalcoholConsumptiondietAndExerciseHabitsc                 S   s   g | ]}|d  qS )possible_causes ).0itemr(   r(   N/Users/harjaapdhillon/Desktop/newidea/medvista_backend/Services/Diagnostics.py
<listcomp>z   s    z#get_diagnostics.<locals>.<listcomp>)r   z
                    INSERT INTO diagnostics (patient_id, visits_id, diagnostics, doctor_id)
                    VALUES (%s, %s, %s, %s);
                zError in get_diagnostics: Internal server error: )r   argsgetjsonloadsprint	Exceptionr   r   cursorexecutefetchallfetchonecommitclosepromptsget_diagnosticsr   str)visit_idr   e
connectionr4   r'   resultrowsfiltered_resultsrowaccountr   r   r   r   	doctor_idr   r   r   r   r    r!   r"   r#   patientSymptomsr%   r&   possibleCausesByDoctorpromptr   Z
diagnosticr(   r(   r+   r;      s   

(r;   c               
   C   s0  t  } | d}| d}| d}| d}g d}|D ]}|| vs(| | s6td| ddd	f  S qt }zzt| }|d
|||f dd | D }	t	||	 }
|
slt
d| d| d| d nR|d|f |d|f |d|f |d|f |d|f |dd|f |dd|f |dd|f |dd|f |D ]}|d||||f q|  W d    n1 sw   Y  W n1 ty } z$|  t
dt|  td| ddd fW  Y d }~W |  S d }~ww W |  n|  w td!d"dd#fS )$Nr=   rE   r   r   )r   r=   rE   r   zMissing required field: r	   r
     z
                SELECT diagnostics FROM diagnostics_by_doctor
                WHERE visits_id = %s AND doctor_id = %s AND patient_id = %s
            c                 S   s   h | ]}t |d  qS )r   )int)r)   rC   r(   r(   r+   	<setcomp>   s    z/update_diagnostics_by_doctor.<locals>.<setcomp>z+All diagnostics already exist for visit_id z, doctor_id z, patient_id .z6DELETE FROM diagnostics_by_doctor WHERE visits_id = %sz6DELETE FROM medications_by_doctor WHERE visits_id = %sz,DELETE FROM medications WHERE visits_id = %sz/DELETE FROM diet_by_doctor WHERE visits_id = %sz%DELETE FROM diet WHERE visits_id = %sz0UPDATE visits SET diagnostics = %s WHERE id = %s   z0UPDATE visits SET medications = %s WHERE id = %sr   z)UPDATE visits SET diet = %s WHERE id = %sz.UPDATE visits SET food_type = %s WHERE id = %svegz
                        INSERT INTO diagnostics_by_doctor (visits_id, doctor_id, patient_id, diagnostics)
                        VALUES (%s, %s, %s, %s)
                    z'Error in update_diagnostics_by_doctor: zInternal server error r   z+Diagnostics by doctor updated successfully.false   )r   get_jsonr/   r   r   r   r4   r5   r6   setr2   r8   r3   rollbackr<   r9   )r   r=   rE   r   r   required_fieldsfieldr?   r4   Zexisting_diagnosticsZnew_diagnosticsZdiagnostic_idr>   r(   r(   r+   update_diagnostics_by_doctor   s   





'$
rV   c              
   C   s  | st ddigdddfS t }z]z't|jdd}d}||| f | }W d    n1 s3w   Y  W n/ tyh } z#td	t|  t dd
| igdddfW  Y d }~W |	  S d }~ww W |	  n|	  w |st ddigdddfS t |dddfS )Nr   zMissing visit_idr	   r   rI   Tr   ar  
                SELECT 
                    d.id AS diagnostic_id,
                    d.patient_id,
                    d.visits_id,
                    d.diagnostics AS diagnostic,
                    d.created_at AS diagnostic_created_at,
                    d.updated_at AS diagnostic_updated_at,
                    d_d.id AS diagnostic_by_doctor_id,
                    d_d.doctor_id,
                    d_d.diagnostics AS doctor_diagnostic,
                    d_d.created_at AS doctor_diagnostic_created_at,
                    d_d.updated_at AS doctor_diagnostic_updated_at
                FROM 
                    diagnostics d
                INNER JOIN 
                    diagnostics_by_doctor d_d
                ON 
                    d.id = d_d.diagnostics AND d.visits_id = d_d.visits_id
                WHERE 
                    d.visits_id = %s
            z#Error in get_diagnostics_by_visit: r-   r   zNo data foundrO   r   r   )
r   r   r   r4   r5   r6   r3   r2   r<   r9   )r=   r?   r4   queryr@   r>   r(   r(   r+   get_diagnostics_by_visit   s*   
*
rX   c               
   C   sF  z{t  } |  }tj}|d}|d}|d}|d}|r%|r%|s/tddddfW S d	}|||||f | }|rV|  |	  | 	  td
dddfW S d}	||	||||f | 
  |j}
|	  | 	  td|
dddfW S  ty } ztdt|  tddt|ddfW  Y d }~S d }~ww )Nr   	visits_idr   rE   4patient_id, visits_id, and diagnostics are required.r	   r
   rI   z{
            SELECT id FROM diagnostics 
            WHERE patient_id = %s AND visits_id = %s AND diagnostics = %s
        zdiagnostics already exists.i  z
            INSERT INTO diagnostics (patient_id, visits_id, diagnostics, doctor_id)
            VALUES (%s, %s, %s, %s)
        z!diagnostics created successfully.rO   )r   Zdiagnostics_idr   rP   zError in create_diagnostic: z*Error occurred while creating diagnostics.r   r   detailsr   )r   r4   r   r0   r/   r   r5   r7   r6   r9   r8   	lastrowidr3   r2   r<   )r?   r4   r   r   rY   r   rE   check_queryexisting_recordinsert_queryZnew_diagnostics_idr>   r(   r(   r+   create_diagnostic  s<   



$ra   c              
   C   s   z=t  }| }d}||| f |  |jdkr,|  |  tddddfW S |  |  tdddd	fW S  tyd } ztd
t	|  tddt	|ddfW  Y d }~S d }~ww )Nz%DELETE FROM diagnostics WHERE id = %sr   zdiagnostics not found.r	   r
   r   z!diagnostics deleted successfully.rO   r   zError in delete_diagnostic: z'Error occurred while diagnostics cause.r[   r   )
r   r4   r5   r8   rowcountr9   r   r3   r2   r<   )r   r?   r4   delete_queryr>   r(   r(   r+   delete_diagnosticK  s$   
$rd   c           
   
   C   s   zht  }| }tj}|d}|d}|d}|d}|r%|r%|s/tddddfW S d	}||||||| f |  |jd
krW|	  |	  tddddfW S |	  |	  tddddfW S  t
y }	 ztdt|	  tddt|	ddfW  Y d }	~	S d }	~	ww )Nr   rY   r   rE   rZ   r	   r
   rI   z
            UPDATE diagnostics
            SET patient_id = %s, visits_id = %s, diagnostics = %s, doctor_id = %s
            WHERE id = %s
        r   z)Diagnostics not found or no changes made.r   z!Diagnostics updated successfully.rO   r   zError in update_diagnostic: z*Error occurred while updating Diagnostics.r[   r   )r   r4   r   r0   r/   r   r5   r8   rb   r9   r3   r2   r<   )
r   r?   r4   r   r   rY   r   rE   update_queryr>   r(   r(   r+   update_diagnosticb  s2   




$rf   )flaskr   r   confr   Services.promptsr   Services.ai_workerr   
contextlibr   r0   r:   r;   rV   rX   ra   rd   rf   r(   r(   r(   r+   <module>   s     &@-.