
    0iE                       d Z ddlmZ ddlZddlZddlZddlZddlZddlZddl	m
Z
 ddlmZmZ ddlmZ ddlmZmZ ddlmZmZmZmZmZmZmZ  ed	d
g      Z G d de      Z G d de      Z G d de      ZddZddZ 	 	 	 	 ddZ!	 	 	 	 	 	 	 	 ddZ"ejG                  d      d d       Z$ejG                  d      d d       Z%ejG                  d      d d       Z&y)!uu  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.

- 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_pdfz/exportexport)prefixtagsc                  d    e Zd ZU  eddd      Zded<   ded<   d	Zd
ed<    edd      Zded<   y	)ExportClaim.      )geleintnumberz#Literal['independent', 'dependent']typeNz
int | Noneparent   
min_lengthstrtext)__name__
__module____qualname__r	   r   __annotations__r   r"        -/var/www/ai.patentyazar.com/app/api/export.pyr   r   &   s6    c*FC*
--FJca(D#(r(   r   c                  L    e Zd ZU  eddd      Zded<    edd	      Zd
ed<   y)ExportFigure.2   zBase64-encoded PNG bytes)r    descriptionr!   
png_base64Nr   default
max_length
str | Nonetitle)r#   r$   r%   r	   r.   r&   r3   r'   r(   r)   r+   r+   -   s'    CB<VWJWds;E:;r(   r+   c                      e Zd ZU  eddd      Zded<    edd	      Zd
ed<    edd      Zded<    edd      Zded<    edd      Z	ded<    ee
d      Zded<   y)ExportRequest.   r   )r    r1   r!   r3   Nr,   r/   r2   reference_coded   r   description_markdownr   zlist[ExportClaim]claims
   abstract)default_factoryr1   zlist[ExportFigure]figures)r#   r$   r%   r	   r3   r&   r7   r9   r:   r<   listr>   r'   r(   r)   r5   r5   2   sm    sqS9E39!&t!CNJC %cc :#: %ca 8F8#"-Hc-"'"LGLr(   r5   c                `    t        j                  dd|       j                  d      }|d d xs dS )Nz[^a-zA-Z0-9_-]+_<   patent)resubstrip)valuess     r)   _slugrI   ;   s1    
!3.44S9ASb6Xr(   c           	        t        | j                  | j                        t        | j                  | j                  D cg c]  }|j                          c}      t        | j                  | j                        d}| j                  rg }t        | j                  d      D ]g  \  }}	 t        j                  |j                  d      }|j#                  d      st!        d	d
| d      |j%                  ||j                  d       i t'        | j                  |      |d<   |S c c}w # t        j                  t        f$ r}t!        d	d
| d|       |d}~ww xY w)us   Tüm DOCX dosyalarını üret, {filename_base: bytes} dict'i döner.

    Figures boşsa Resimler.docx yoktur.
    )r3   markdown)r3   r:   )r3   r<   )	TarifnameIstemlerOzetr   )startT)validatei  u   Şekil z base64 decode edilemedi: status_codedetailNs   PNG

u'    geçerli PNG değil (magic bytes yok).)	png_bytesr3   )r3   r>   Resimler)r   r3   r9   r   r:   
model_dumpr   r<   r>   	enumeratebase64	b64decoder.   binasciiError
ValueErrorr   
startswithappendr   )payloadc
docx_filesdecodedidxfigpngexcs           r)   _build_all_docxrg   @   sQ    ,--'*F*F
 &--(PA(P
 $'--'BRBRS$J  !'//; 	CHC&&s~~E >>"67# #$SE)PQ  NNsyyAB	C "4'--QX!Y
:/ )Q NNJ/ # #$SE)CC5I s   D+,!D00E"	EE"c                z  K   | j                         D cg c]  }t        |       }}	 t        j                  |  d{   }t        t        | j                         |d            S c c}w 7 .# t        $ r}t        dt        |            |d}~wt        $ r}t        dt        |            |d}~ww xY ww)u$   Tüm DOCX'leri paralel PDF'e çevir.Ni  rQ   i  T)strict)valuesr   asynciogatherr
   r   r!   r   dictzipkeys)ra   btaskspdf_bytes_listrf   s        r)   _convert_all_to_pdfrs   d   s      .8->->-@A #AEAG&~~u55 JOO%~dCDD B5# GCH=3F GCH=3FGsO   B;A)B;A0 A. A0 *B;.A0 0	B89BB8B33B88B;c                   t        j                         }t        j                  |dt        j                        5 }|r0|j                         D ]  \  }}|j                  |  d| d|        |r0|j                         D ]  \  }}|j                  |  d| d|        ddd       |j                         S # 1 sw Y   |j                         S xY w)u$   ZIP paketi — her katman opsiyonel.wrA   z.docxz.pdfN)ioBytesIOzipfileZipFileZIP_DEFLATEDitemswritestrgetvalue)basera   	pdf_filesbufzfnamedatas          r)   
_build_zipr   s   s     **,C	c7#7#7	8 8B(..0 9
dtfAdV51489'oo/ 8
dtfAdV40$788 <<>8 <<>s   A%B77Cz/docxc                   K   t        | j                  xs | j                        }t        |       }t	        t        ||d      ddd| di      S w)u   Yalnızca DOCX ZIP paketi.Nr~   ra   r   application/zipContent-Dispositionattachment; filename="z_TurkPatent.zip"content
media_typeheaders)rI   r7   r3   rg   r   r   )r_   r~   ra   s      r)   export_docxr      s\      ''87==9D )JtL$!%;D6AQ#R
 s   AAz/pdfc                   K   t        | j                  xs | j                        }t        |       }t	        |       d{   }t        t        |d|      ddd| di      S 7 $w)uA   Yalnızca PDF ZIP paketi (DOCX'lerden LibreOffice ile çevrilir).Nr   r   r   r   z_TurkPatent_PDF.zip"r   rI   r7   r3   rg   rs   r   r   r_   r~   ra   r   s       r)   
export_pdfr      sn      ''87==9D )J)*55IK$!%;D6AU#V
  6   =A&A$ %A&z/bothc                   K   t        | j                  xs | j                        }t        |       }t	        |       d{   }t        t        |||      ddd| di      S 7 $w)u/   Hem DOCX hem PDF — tek ZIP içinde 6-8 dosya.Nr   r   r   r   z_TurkPatent_Full.zip"r   r   r   s       r)   export_bothr      sn      ''87==9D )J)*55IyQ$!%;D6AV#W
  6r   )rG   r!   returnr!   )r_   r5   r   dict[str, bytes])ra   r   r   r   )r~   r!   ra   dict[str, bytes] | Noner   r   r   bytes)r_   r5   r   r   )'__doc__
__future__r   rk   rX   rZ   rv   rD   rx   typingr   fastapir   r   fastapi.responsesr   pydanticr   r	   app.services.docxr
   r   r   r   r   r   r   routerr   r+   r5   rI   rg   rs   r   postr   r   r   r'   r(   r)   <module>r      s   #    	 	   , & %   
)8*	5)) )<9 <
MI M
!HE EE
 ( '	
 $ W  V  W r(   