+
    Lzj;                       R t ^ RIHt ^ RIt^ RIt^ RIt^ RIt^ RIt^ RIt^ RI	H
t
 ^ RIHtHt ^ RIHt ^ RIHtHt ^ RIHtHtHtHtHtHtHt ^ RIHtHt ]! R	R
.R7      t ! R R]4      t ! R R]4      t  ! R R]4      t!R R lt"R R lt#R R lt$R R lt%]PM                  R4      R R l4       t']PM                  R4      R R l4       t(]PM                  R 4      R! R" l4       t)R# )#u{  Export endpoints — DOCX + PDF zip paketleri.

EPATS (TPMK elektronik başvuru) kuralı: her unsur ayrı dosya. Tek ZIP içinde
3 (opsiyonel 4) ayrı dosya döner. EPO ve USPTO da unsurları ayrı belge olarak
kabul ettiği için aynı paket yapısı üç ofiste de çalışır.

Çıktı jurisdiction-aware'dir: sayfa boyutu, kenar boşlukları, belge
başlıkları ve dosya adları `services/docx/office_spec.py`'den gelir.

- POST /api/v1/export/docx — 3-4 DOCX, format="docx"
- POST /api/v1/export/pdf  — 3-4 PDF (LibreOffice headless ile DOCX'ten çevrilir)
- POST /api/v1/export/both — 3-4 DOCX + 3-4 PDF (ikisi de dahil)
)annotationsN)Literal)	APIRouterHTTPException)Response)	BaseModelField)LibreOfficeNotFoundErrorPdfConversionErrorbuild_abstract_docxbuild_claims_docxbuild_description_docxbuild_figures_docxconvert_docx_to_pdf)Jurisdictionget_office_specz/exportexport)prefixtagsc                  n    ] tR t^+t$ ]! R^^R7      tR]R&   R]R&   RtR]R	&   ]! R^R
7      tR]R&   Rt	R# )ExportClaim.)geleintnumberz#Literal['independent', 'dependent']typeNz
int | Noneparent
min_lengthstrtext )
__name__
__module____qualname____firstlineno__r   r   __annotations__r   r    __static_attributes__r!       P/Users/zincirx/Documents/projelerim/patentyazar/backend-python/app/api/export.pyr   r   +   s6    c*FC*
--FJca(D#(r(   r   c                  V    ] tR t^2t$ ]! R^2RR7      tR]R&   ]! R^R7      tR]R	&   R
tR# )ExportFigure.zBase64-encoded PNG bytes)r   descriptionr   
png_base64Ndefault
max_length
str | Nonetitler!   )	r"   r#   r$   r%   r   r-   r&   r2   r'   r!   r(   r)   r+   r+   2   s'    CB<VWJWds;E:;r(   r+   c                      ] tR t^7t$ ]! R^^R7      tR]R&   ]! R^2R7      tR]R&   ]! R^dR	7      tR]R
&   ]! R^R	7      t	R]R&   ]! R^
R	7      t
R]R&   ]! ]^2R7      tR]R&   ]! ]P                  RR7      tR]R&   RtR# )ExportRequest.)r   r0   r   r2   Nr.   r1   reference_coder   description_markdownzlist[ExportClaim]claimsabstract)default_factoryr0   zlist[ExportFigure]figuresu}   Hedef patent ofisi. Sayfa boyutu, kenar boşlukları, belge başlıkları ve dosya adlarını belirler. Geriye uyum için TR.)r/   r,   r   jurisdictionr!   )r"   r#   r$   r%   r   r2   r&   r5   r6   r7   r8   listr:   r   TRr;   r'   r!   r(   r)   r4   r4   7   s    sqS9E39!&t!CNJC %cc :#: %ca 8F8#"-Hc-"'"LGL!&P"L, r(   r4   c                    V ^8  d   QhRRRR/# )   valuer   returnr!   )formats   "r)   __annotate__rC   G   s        r(   c                v    \         P                  ! R RV 4      P                  R4      pVR,          ;'       g    R# )z[^a-zA-Z0-9_-]+_:N<   Npatent)resubstrip)r@   ss   & r)   _slugrL   G   s2    
!3.44S9AS6Xr(   c                    V ^8  d   QhRRRR/# )r?   payloadr4   rA   dict[str, bytes]r!   )rB   s   "r)   rC   rC   L   s     / /] //? /r(   c                   \        V P                  4      pVP                  \        V P                  V P
                  V P                  R7      VP                  \        V P                  V P                   Uu. uF  q"P                  4       NK  	  upV P                  R7      VP                  \        V P                  V P                  V P                  R7      /pV P                  '       d   . p\        V P                  ^R7       Fo  w  rV \        P                   ! VP"                  RR7      pTP-                  R4      '       g   \+        RRT R2R
7      hTP/                  RTRTP                  /4       Kq  	  \1        V P                  VV P                  R7      W1P2                  &   V# u upi   \$        P&                  \(        3 d   p\+        RRT R	T 2R
7      ThRp?ii ; i)u   Tüm DOCX dosyalarını üret, {filename_base: bytes} dict'i döner.

Dosya adları ofise göredir (TR: Tarifname/Istemler/Ozet,
EP/US: Description/Claims/Abstract). Figures boşsa şekil dosyası yoktur.
)r2   markdownr;   )r2   r7   r;   )r2   r8   r;   )startT)validatei  u   Şekil z base64 decode edilemedi: status_codedetailNs   PNG

u'    geçerli PNG değil (magic bytes yok).	png_bytesr2   )r2   r:   r;   )r   r;   filename_descriptionr   r2   r6   filename_claimsr   r7   
model_dumpfilename_abstractr   r8   r:   	enumeratebase64	b64decoder-   binasciiError
ValueErrorr   
startswithappendr   filename_figures)	rN   specc
docx_filesdecodedidxfigpngexcs	   &        r)   _build_all_docxrm   L   s    7//0D!!#9--11 --$

 	/--,3NN;NqLLNN; --

 	 3--%% --!
$J$  !'//;HC&&s~~E >>"677# #$SE)PQ  NNKgsyyAB < -?-- ---

(() A < NNJ/ # #$SE)CC5I s   5F%"F**GGGc                    V ^8  d   QhRRRR/# )r?   rg   rO   rA   r!   )rB   s   "r)   rC   rC   ~   s      E E EEr(   c                  "   V P                  4        Uu. uF  p\        V4      NK  	  pp \        P                  ! V!  G Rj  xL
 p\        \        T P                  4       TRR7      4      # u upi  L.  \         d   p\        R\        T4      R7      ThRp?i\         d   p\        R\        T4      R7      ThRp?ii ; i5i)u$   Tüm DOCX'leri paralel PDF'e çevir.Ni  rT   i  T)strict)valuesr   asynciogatherr	   r   r   r
   dictzipkeys)rg   btaskspdf_bytes_listrl   s   &    r)   _convert_all_to_pdfrz   ~   s      .8->->-@A-@ #-@EAG&~~u55 JOO%~dCDD B5# GCH=3F GCH=3FGsV   CA-CA4 A2A4 *C2A4 4C ?BC #C $B;;C  Cc               (    V ^8  d   QhRRRRRRRR/# )r?   baser   rg   zdict[str, bytes] | None	pdf_filesrA   bytesr!   )rB   s   "r)   rC   rC      s2      
 ( '	
 r(   c           	        \         P                  ! 4       p\        P                  ! VR\        P                  4      ;_uu_ 4       pV'       d2   VP                  4        F  w  rVVP                  V  RV R2V4       K  	  V'       d2   VP                  4        F  w  rVVP                  V  RV R2V4       K  	  RRR4       VP                  4       #   + '       g   i     TP                  4       # ; i)u$   ZIP paketi — her katman opsiyonel.wrE   z.docxz.pdfN)ioBytesIOzipfileZipFileZIP_DEFLATEDitemswritestrgetvalue)r|   rg   r}   bufzfnamedatas   $$$    r)   
_build_zipr      s     **,C	c7#7#7	8	8B(..0
tfAdV5148 1'oo/
tfAdV40$7 0 
9 <<> 
9	8 <<>s   AC1CC.	z/docxc                    V ^8  d   QhRRRR/# r?   rN   r4   rA   r   r!   )rB   s   "r)   rC   rC      s      }  r(   c           
        "   \        V P                  ;'       g    V P                  4      p\        V P                  4      P
                  p\        V 4      p\        \        WRR7      RRRV RV R2/R7      # 5i)	u   Yalnızca DOCX ZIP paketi.Nr|   rg   r}   application/zipContent-Dispositionattachment; filename="rE   z.zip"content
media_typeheaders)	rL   r5   r2   r   r;   package_labelrm   r   r   )rN   r|   labelrg   s   &   r)   export_docxr      sw      ''887==9DG001??E )JtL$!%;D65'#O
 s   A6A8z/pdfc                    V ^8  d   QhRRRR/# r   r!   )rB   s   "r)   rC   rC      s      m  r(   c           
        "   \        V P                  ;'       g    V P                  4      p\        V P                  4      P
                  p\        V 4      p\        V4      G Rj  xL
 p\        \        VRVR7      RRRV RV R2/R7      #  L'5i)	uA   Yalnızca PDF ZIP paketi (DOCX'lerden LibreOffice ile çevrilir).Nr   r   r   r   rE   z	_PDF.zip"r   
rL   r5   r2   r   r;   r   rm   rz   r   r   rN   r|   r   rg   r}   s   &    r)   
export_pdfr      s      ''887==9DG001??E )J)*55IK$!%;D65'#S
  6s   A"B$B%(Bz/bothc                    V ^8  d   QhRRRR/# r   r!   )rB   s   "r)   rC   rC      s      }  r(   c           
       "   \        V P                  ;'       g    V P                  4      p\        V P                  4      P
                  p\        V 4      p\        V4      G Rj  xL
 p\        \        WVR7      RRRV RV R2/R7      #  L&5i)	u/   Hem DOCX hem PDF — tek ZIP içinde 6-8 dosya.Nr   r   r   r   rE   z
_Full.zip"r   r   r   s   &    r)   export_bothr      s      ''887==9DG001??E )J)*55IyQ$!%;D65'#T
  6s   A"B$B%'B)*__doc__
__future__r   rr   r]   r_   r   rH   r   typingr   fastapir   r   fastapi.responsesr   pydanticr   r   app.services.docxr	   r
   r   r   r   r   r   app.services.docx.office_specr   r   routerr   r+   r4   rL   rm   rz   r   postr   r   r   r!   r(   r)   <module>r      s    #    	 	   , & %   H	)8*	5)) )<9 <
I  
/dE$ W  V   W r(   