
    {i@                     D   d Z ddlmZmZmZ ddlmZ ddlZddlZddl	m	Z	 ddl
mZ 	 ddlmZmZmZmZmZmZmZmZ ddlmZ d	Z eded      Zej:                  j=                  dd      Zd Z d)de!de"fdZ#ejI                  ddg      e d               Z%ejI                  ddg      e d               Z&ejI                  ddg      e d               Z'ejI                  ddg      e d               Z(ejI                  d dg      e d!               Z)ejI                  d"dg      e d#               Z*ejI                  d$d%dg      e d&               Z+er	  e         ed'       yy# e$ rZ ed
e        dZY dZ[9dZ[ww xY w# e,$ rZ ed(e        Y dZ[ydZ[ww xY w)*z
Case Management API for AI Lawyer
Flask Blueprint for case-specific document management
This is a separate module that can be added without affecting the main service
    )	BlueprintrequestjsonifywrapsN)datetime)Path)get_sessionCaseCaseDocumentDocumentChunk	CaseQueryCaseMetadataUserinit_db)CaseDocumentProcessorTz![Case API] Models not available: Fcasesz/cases)
url_prefixFLASK_API_KEYzeventheodds-flask-api-key-2025c                 .     t                fd       }|S )z/Decorator to require API key for case endpointsc                      t         j                  j                  dd      }|t        k7  rt	        ddi      dfS  | i |S )Nz	X-API-Key errorzInvalid API keyi  )r   headersgetCASE_API_KEYr   )argskwargsapi_keyfs      3/var/www/html/eventheodds/ai-lawyer-rag/case_api.py	decoratedz'require_case_api_key.<locals>.decorated#   sG    //%%k26l"G%678#==$!&!!    r   )r    r"   s   ` r!   require_case_api_keyr$   !   s!    
1X" "
 r#   emailreturnc                    |xs d}| j                  t              j                  |      j                         }|s>t        |      }| j	                  |       | j                          | j                  |       |j                  S )z'Get or create a user and return user IDzdefault@eventheodds.ai)r%   )queryr   	filter_byfirstaddcommitrefreshid)sessionr%   users      r!   get_or_create_user_idr1   ,   sj    --E==((u(5;;=D% D77Nr#   z/createPOST)methodsc            
      R   t         st        ddi      dfS 	 t        j                  d      xs i } | j	                  d      }|st        ddi      dfS t               }	 t        || j	                  d	            }t        ||| j	                  d
      | j	                  d      | j	                  d      | j	                  d            }|j                  |       |j                          t        |j                        }|j                  |       |j                          t        d|j                  |j                  dd      |j                          S # |j                          w xY w# t        $ r6}t!        j"                          t        dt%        |      i      dfcY d}~S d}~ww xY w)zCreate a new caser   Case management not available  TsilentnamezCase name is required  r%   descriptionjurisdictioncase_numberarea_of_law)user_idr9   r;   r<   r=   r>   case_idzCase created successfully)successrA   r9   message  N)MODELS_AVAILABLEr   r   get_jsonr   r
   r1   r   r+   r,   r   r.   	case_uuidr9   close	Exception	traceback	print_excstr)datar9   r/   r?   case	case_metaes          r!   create_caserQ   <   sg    !@ABCGG'/t,2xxG%<=>CC-	+GTXXg5FGG HH]3!XXn5 HH]3 HH]3D KKNN %TWW5IKK	"NN>>		6	  MMOGMMO /Q()3../s<   ;E' 
E' C#E E' E$$E' '	F&0+F!F&!F&z/listGETc                     t         st        ddi      dfS 	 t               } 	 t        |       }| j	                  t
              j                  |      j                         }t        d|D cg c]w  }|j                  |j                  |j                  |j                  |j                  t        |j                        |j                  r|j                  j!                         nddy c}d      | j#                          S c c}w # | j#                          w xY w# t$        $ r6}t'        j(                          t        dt+        |      i      d	fcY d}~S d}~ww xY w)
zList all cases for the userr   r5   r6   )r?   TN)rA   r9   r<   r>   statusdocument_count
created_at)rB   r   rD   )rE   r   r
   r1   r(   r   r)   allrG   r9   r<   r>   rT   len	documentsrV   	isoformatrH   rI   rJ   rK   rL   )r/   r?   r   crP   s        r!   
list_casesr\   m   s"    !@ABCGG/-	+G4GMM$'11'1BFFHE #  $%;; !()'(}}"#((*-akk*:BC,,all&<&<&>TX   MMO MMO /Q()3../sH   
D AD *A<C?
&D .D ?D DD 	E"+EEEz/<case_uuid>c                    t         st        ddi      dfS 	 t               }	 |j                  t              j                  |       j                         }|st        ddi      df|j                          S i }|j                  rg|j                  j                  xs i |j                  j                  xs i |j                  j                  xs g |j                  j                  xs g d}t        d|j                  |j                  |j                  |j                   |j"                  |j$                  |j&                  |j(                  r|j(                  j+                         nd	t-        |j.                        |d

d      |j                          S # |j                          w xY w# t0        $ r6}t3        j4                          t        dt7        |      i      dfcY d	}~S d	}~ww xY w)zGet case detailsr   r5   r6   rG   Case not found  )parties	key_datesclaims
key_issuesTN)
rA   r9   r;   r<   r=   r>   rT   rV   rU   metadata)rB   rN   rD   )rE   r   r
   r(   r   r)   r*   rH   metadata_recordra   rb   rc   rd   rG   r9   r;   r<   r=   r>   rT   rV   rZ   rX   rY   rI   rJ   rK   rL   )rG   r/   rN   re   rP   s        r!   get_caserg      s    !@ABCGG%/-	==&0090EKKMD)9:;S@8 MMO3 H###33;;Ar!%!5!5!?!?!E2"2299?R"&"6"6"A"A"GR	 #~~ II#'#3#3$($5$5#'#3#3#'#3#3"kkAE$//";";"=VZ&)$..&9 (   MMOGMMO /Q()3../sB   
F( AF %F( 6DF F( F%%F( (	G'1+G"G'"G'z/<case_uuid>/uploadc                    t         st        ddi      dfS 	 dt        j                  vrt        ddi      dfS t        j                  d   }|j                  dk(  rt        ddi      dfS t               }	 |j                  t              j                  | 	      j                         }|st        dd
i      df|j                          S t        j                  j                  dd      }|j                         }t        | |j                        }|j!                  ||j                  |dk7  r|nd      }|j                  d      s/t        d|j                  dd      i      df|j                          S t#        |j$                  |d   |d   |d   |d   |d   |d   |d   d|d   
      }|j'                  |       |j)                          |d   D ]U  }	t+        |j$                  |	d   |	d   |	d   |	j                  d       |	j                  d!      "      }
|j'                  |
       W |j)                          |d#   j                  d$      r^|j,                  rR|j,                  j.                  xs i }|j1                  |d#   d$          ||j,                  _        |j)                          t        d%|j$                  |d   |d   |d   |d   |d#   d&|d    d'd(      |j                          S # |j                          w xY w# t2        $ r6}t5        j6                          t        dt9        |      i      d)fcY d}~S d}~ww xY w)*z$Upload a document to a specific caser   r5   r6   filezNo file providedr:   r   zNo file selectedr^   r_   r`   document_typeauto)rG   r?   N)file_contentfilenamerj   rB   zProcessing failedrm   original_filename	file_type	file_size	file_hashcategory	completedchunk_count)
rA   rm   rn   ro   rp   rq   rj   rr   processing_statusrt   chunkschunk_indexcontentcontent_lengthpage
start_char)document_idrw   rx   ry   page_numberr{   re   ra   TzDocument processed: z chunks created)rB   r|   rm   rj   rr   chunks_createdmetadata_extractedrC   rD   )rE   r   r   filesrm   r
   r(   r   r)   r*   rH   formr   readr   r?   process_uploadr   r.   r+   r,   r   rf   ra   updaterI   rJ   rK   rL   )rG   ri   r/   rN   rj   rl   	processorresultcase_doc
chunk_datachunkexisting_partiesrP   s                r!   upload_case_documentr      sT    !@ABCGG\/&G%7893>>}}V$==BG%7893>>-O	==&0090EKKMD)9:;S@X MMOS $LL,,_fEM  99;L .#I
 --)/</FmD . F ::i(VZZ1DE  n MMOe $
+"()<"= - - -$_5
+"-"=1H KK!NN %X. 	#
% ( *= 9&y1#-.>#? *v 6)~~l; E"	# NN j!%%i0'''+';';'C'C'Ir$$++F:,>y,IJ3CD((0NN$'{{"#67!'!8":."("7&,Z&81&2G1HX	 	 MMOGMMO /Q()3../s[    L 0L )
L 4AK/ 7L BK/ #L 4E*K/ L /LL 	M+L>8M>Mz/<case_uuid>/documentsc                 b   t         st        ddi      dfS 	 t               }	 |j                  t              j                  |       j                         }|st        ddi      df|j                          S |j                  t              j                  |j                        j                         }t        d| |D cg c]y  }|j                  |j                  |j                  |j                  |j                  |j                  |j                   |j"                  r|j"                  j%                         nd	d
{ c}d      |j                          S c c}w # |j                          w xY w# t&        $ r6}t)        j*                          t        dt-        |      i      dfcY d	}~S d	}~ww xY w)zGet all documents for a caser   r5   r6   r^   r_   r`   r@   TN)r.   rm   rj   rr   rp   rt   ru   upload_date)rB   rA   rY   rD   )rE   r   r
   r(   r   r)   r*   rH   r   r.   rW   rn   rj   rr   rp   rt   ru   r   rZ   rI   rJ   rK   rL   )rG   r/   rN   rY   docrP   s         r!   get_case_documentsr   &  so    !@ABCGG/-	==&0090EKKMD)9:;S@, MMO)  l3==dgg=NRRTI$  )  "ff$'$9$9),):):$'LL%(]]'*-0-B-BFIoos'@'@'B[_	 $ MMO MMO /Q()3../sU   
E/ AE %E/ 6AE >A>E<E E/ E E,,E/ /	F.8+F)#F.)F.z/<case_uuid>/queryc                 N   t         st        ddi      dfS 	 t        j                  d      xs i }|j	                  dd      j                         }|st        ddi      d	fS |j	                  d
d      }t               }	 |j                  t              j                  |       j                         }|st        ddi      df|j                          S g }|j                  D ]  }|j                  t              j                  |j                        j                         }|D ]Y  }	|j!                  |	j"                  |j$                  |j&                  |	j(                  |	j*                  r|	j*                  ndd       [  |s t        ddg dd      |j                          S |j-                         }
t/        |
j1                               }g }|D ]B  }	|	d   j-                         t3        fd|D              }|dkD  s0|j!                  ||	f       D |j5                  d d       |dd D cg c]  }|d   	 }}dj7                  |D cg c]  }d|d    d|d    d |d!    d"|d   dd#  ! c}      }|rI|D cg c]  }|d   |d   |d!   d$ }}d%}|dd& D ]"  }|d'|d    d(|d!    d)z  }||d   dd*  d+z  }$ nd,}g }t9        |j                  ||||t;        |      -      }|j=                  |       |j?                          t        d|||t;        |      t;        |      d.      |j                          S c c}w c c}w c c}w # |j                          w xY w# t@        $ r6}tC        jD                          t        dtG        |      i      d*fcY d}~S d}~ww xY w)/z!Query a specific case's documentsr   r5   r6   Tr7   r(   r   zQuery is requiredr:   
query_typegeneralr^   r_   r`   )r|   rx   )rx   documentrj   rz   sectionzUNo documents have been uploaded to this case yet. Please upload case documents first.r   )rB   answersourceschunks_searchedc              3   ,   K   | ]  }|v sd   yw)   N ).0wordcontent_lowers     r!   	<genexpr>zquery_case.<locals>.<genexpr>  s     O$9NAOs   	c                     | d   S )Nr   r   )xs    r!   <lambda>zquery_case.<locals>.<lambda>  s
    QqT r#   )keyreverseN   r   z

---

[r   z - rj   z - Page rz   z]
i  )r   rj   rz   zBased on the case documents:

   z**z	** (Page z):
rD   z...

zCNo relevant information found in the case documents for this query.)rA   
query_textr   responser   r   )rB   r   r   r   r   relevant_chunks)$rE   r   r   rF   r   stripr
   r(   r   r)   r*   rH   rY   r   r.   rW   appendrx   rn   rj   r}   summarylowersetsplitsumsortjoinr   rX   r+   r,   rI   rJ   rK   rL   )rG   rM   r   r   r/   rN   rv   r   
doc_chunksr   query_lowerquery_wordsscored_chunksscorer[   
top_chunkscontextr   r   
case_queryrP   r   s                        @r!   
query_caser   O  s    !@ABCGGh/t,2XXgr*002
G%89:C??XXlI6
-Z	==&0090EKKMD)9:;S@n MMOi F~~ 	$]]=9CCPSPVPVCW[[]
' EMM#(==$'$9$9),):): % 1 149MM5==y# 	 #u!'(	  N MMO %**,Kk//12KM 9 %i 0 6 6 8O+OO19!((%8	9 >4@(5bq(9:1!A$:J: $((#* AjM?#a&8%9!F)CPQR[P\]b^bPcOde* G  ( 	 %&jM)*?); !&	  <#BQ =A1Z=/1V9+TJJF9ds!3 4G<<F= _ #%% #FJ KK
#NN "(#&v;#&z?  MMOg ;*R MMO /Q()3../s   A
M% #M%  AM M% B?M M% $AM 0M 1M=M $M2M ?MBM 0M% M M""M% %	N$.+NN$N$z/<case_uuid>/deleteDELETEc                 8   t         st        ddi      dfS 	 t               }	 |j                  t              j                  |       j                         }|st        ddi      df|j                          S |j                  }|j                  |       |j                          t        dd| d	d
      |j                          S # |j                          w xY w# t        $ r6}t        j                          t        dt        |      i      dfcY d}~S d}~ww xY w)z#Delete a case and all its documentsr   r5   r6   r^   r_   r`   TzCase "z" deleted successfully)rB   rC   rD   N)rE   r   r
   r(   r   r)   r*   rH   r9   deleter,   rI   rJ   rK   rL   )rG   r/   rN   	case_namerP   s        r!   delete_caser     s     !@ABCGG/-	==&0090EKKMD)9:;S@ MMO 		INN4 NN#I;.DE 
 MMOGMMO /Q()3../sA   
C AC %C 6>C 4C CC 	D#+DDDz[Case API] Database initializedz*[Case API] Database initialization error: )N)-__doc__flaskr   r   r   	functoolsr   osrJ   r   pathlibr	   modelsr
   r   r   r   r   r   r   r   case_processorr   rE   ImportErrorrP   print__name__case_bpenvironr   r   r$   rL   intr1   routerQ   r\   rg   r   r   r   r   rI   r   r#   r!   <module>r      s,   . -  	   	   5 GX(
; zz~~o/OP	# 	 	  	y6(+,/  ,,/^ 	w(/  )/D 	~w/*/  0*/Z 	$vh7a/  8a/H 	'%9$/  :$/N 	#fX6m/  7m/` 	$x.@A/  B/: @	/0 U  	-aS
12\  @:1#>??@s/   E% F %F*E==FF
FF