
    i                    <   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mZ  ee	      j                         j                  Zej                  j                  j                  Zedz  ZddZ e       ZdZ G d d	e      Z G d
 de      Zdddd	 	 	 	 	 	 	 	 	 ddZddZy)u  Mermaid CLI subprocess ile PNG render.

TürkPatent kuralları:
- Siyah-beyaz, içi boyalı değil, ≥0.5pt çizgi (CSS ile override)
- Metin ≥10pt (themeVariables.fontSize=14px ≈ 10.5pt; yeterli)
- Referans numaraları çizimde kullanıcı tarafından mermaid içinde yazılır

Neden subprocess? mermaid bir Node.js/Chromium paketi; Python için native
port yok. @mermaid-js/mermaid-cli (`mmdc`) en olgun yaklaşım.
    )annotationsN)Pathzturkpatent-theme.jsonc                    t         j                  j                  d      } | r$t        |       j	                         rt        |       S t        j                  d      }|rt        |      S t        dz  dz  dz  }|j	                         r|S y)u$  mmdc binary'sini bul.

    Sıra:
      1. MMDC_BIN environment variable (explicit override)
      2. shutil.which("mmdc") — sistem PATH (global npm install -g senaryosu)
      3. backend-python/node_modules/.bin/mmdc — local npm install senaryosu

    None döner → kurulu değil.
    MMDC_BINmmdcnode_modulesz.binN)osenvirongetr   existsshutilwhich_BACKEND_ROOT)env_pathsystem_pathlocals      </var/www/ai.patentyazar.com/app/services/mermaid/renderer.py_resolve_mmdcr      ss     zz~~j)HDN))+H~,,v&KK  N*V3f<E||~    a]  
.node rect, .node circle, .node ellipse, .node polygon, .node path,
.cluster rect {
  fill: #ffffff !important;
  stroke: #000000 !important;
  stroke-width: 1.5px !important;
}
.edgePath .path, .flowchart-link, .messageLine0, .messageLine1,
.actor, line, path.transition {
  stroke: #000000 !important;
  stroke-width: 1.5px !important;
  fill: none !important;
}
.edgeLabel, .nodeLabel, text, tspan {
  fill: #000000 !important;
  color: #000000 !important;
  font-family: "Times New Roman", serif !important;
}
.arrowheadPath, marker path {
  fill: #000000 !important;
  stroke: #000000 !important;
}
c                      e Zd ZdZy)MermaidRenderErroruL   mmdc çalıştı ama render başarısız (geçersiz diyagram syntax'ı vb.).N__name__
__module____qualname____doc__ r   r   r   r   O   s    Vr   r   c                      e Zd ZdZy)MermaidNotInstalledErroruH   Node.js / mmdc kurulu değil — backend-python/node_modules bekleniyor.Nr   r   r   r   r   r   S   s    Rr   r      i     )scalewidthtimeout_secondsc                 K   t         t         j                         st        d      t        j                         st        dt               t	        j
                  d      5 }t        |      }|dz  }|dz  }|dz  }|j                  | d	
       |j                  t        d	
       t        j                  j                  d      }	|	s$dD ]  }
t        |
      j                         s|
}	 n dddgi}|	r|	|d<   ddl}|dz  }|j                  |j                  |      d	
       t        t               dt        |      dt        |      dt        t              dt        |      dt        |      dt        |      dt        |      ddddg}	 t        j                   t        j"                  |t        j$                  j&                  t        j$                  j&                  d|       d{   }t        j                   |j)                         |       d{   \  }}|j.                  dk7  r5|xs d"j1                  d	d#$      }t-        d%|j.                   d&|dd'        |j                         st-        d(      |j3                         cddd       S 7 7 # t*        $ r}t-        d | d!      |d}~ww xY w# 1 sw Y   yxY ww))u"  Mermaid kaynağını TürkPatent-uyumlu siyah-beyaz PNG'e çevirir.

    Args:
        source: Mermaid diyagram kaynağı (flowchart, sequenceDiagram, vs.)
        scale: PNG ölçeklendirme faktörü (DPI eşdeğeri). 3 → ~300 DPI.
        width: Piksel genişlik (scale * width = output genişlik).
        timeout_seconds: mmdc çalışma süresi limiti.

    Returns:
        PNG bytes.

    Raises:
        MermaidNotInstalledError: mmdc bulunamazsa.
        MermaidRenderError: mermaid syntax hatası veya Chromium başlatma hatası.
    Nu~   mmdc bulunamadı. Global olarak `npm install -g @mermaid-js/mermaid-cli` veya MMDC_BIN env variable ile explicit yol belirtin.u&   TürkPatent theme config bulunamadı: mermaid_)prefixzdiagram.mmdzdiagram.pngz
patent.csszutf-8)encodingPUPPETEER_EXECUTABLE_PATH)z/usr/bin/google-chrome-stablez/usr/bin/google-chromez/usr/bin/chromiumargsz--no-sandboxz--disable-setuid-sandboxexecutablePathr   zpuppeteer.jsonz-iz-oz-cz-Cz-pz-sz-wz-bwhitez-tdefault)stdoutstderr)timeoutzmmdc u   s içinde tamamlanamadır   replace)errorsz
mmdc exit z: i  u8   mmdc başarılı çıkış kodu verdi ama PNG üretmedi.)	_MMDC_BINr   r   _CONFIG_PATHtempfileTemporaryDirectoryr   
write_text_PATENT_CSSr	   r
   r   jsondumpsstrasynciowait_forcreate_subprocess_exec
subprocessPIPEcommunicateTimeoutErrorr   
returncodedecode
read_bytes)sourcer"   r#   r$   tmpdirtmp_path
input_fileoutput_filecss_filechrome_path	candidatepuppeteer_cfg_data_jsonpuppeteer_cfgcmdprocr.   r/   excerrs                       r   render_mermaid_to_pngrU   W   s    , 	 0 0 2&D
 	
  &)OP\~'^__ 
	$	$J	7 S(6<-
.l*fw7K': jjnn%@A 	
 	?))+"+K ^%?@1
 3>/0 #33  KK*+ 	! 	
 	N
OMJJ'
,	a )).."--22"--22
 ( D $+#3#3D4D4D4FP_#``NFF ??a=S(((CC$z$//1B"S#YK%PQQ!!#$%_``%%'gS( S(@ a 	a$u_,==U%VW]``	aSS( S(sp   A"K$BJ<)B"J<AJ*J+,JJJA.J<
KJJ	J9$J44J99J<<KKc                 p    t         duxr- t         j                         xr t        j                  d      duS )u-   Test + health check için — mmdc kurulu mu?Nnode)r3   r   r   r   r   r   r   mmdc_availablerX      s/    D \Y%5%5%7\FLL<PX\<\\r   )returnzPath | None)
rF   r;   r"   intr#   rZ   r$   rZ   rY   bytes)rY   bool)r   
__future__r   r<   r	   r   r5   pathlibr   __file__resolveparent_PACKAGE_ROOTr   r4   r   r3   r8   RuntimeErrorr   r   rU   rX   r   r   r   <module>rd      s   	 #  	   X&&(//$$++22662 O	2W WS| S r(r( r( 	r(
 r( r(j]r   