Ë
    ¼¹Ùj,  ã                   ó  — d Z ddlZddlZddlZddlmZ ej                  j                  d e ee	«      j                  «      «       ddlmZmZ ddlmZ ddlmZmZ d„ ZddlmZmZ d	„ Zd
„ Zd„ Zedk(  r�ej6                  d   dk(  r2 eej6                  d   ej6                  d   ej6                  d   «       yej6                  d   dk(  r$ eej6                  d   ej6                  d   «       y ej8                  e «       yy)u5  
AI Room Designer â€” Stage 1 spike pipeline (LOCAL RIG ONLY, no deploy).

Flow:
  1. prepare  <photo> <mode> <job-dir>   -> writes job.json with the locked
      structure-preserving edit prompt for that mode. The actual image edit is
      executed by whatever image-edit backend is wired in (Stage 1: Muse media
      image-edit pipeline, standing in for the planned Gemini edit route in
      Build Plan v1 â€” same prompt contract, zero paid API spend).
  2. finish   <job-dir> <after-image>   -> copies the edit into the job dir,
      builds a labelled before/after composite + a wipe-slider-style split
      composite, runs qc_score, writes qc.json.

Usage:
  python3 pipeline.py prepare photo.jpg colors-and-lighting ../tests/test2-living
  python3 pipeline.py finish  ../tests/test2-living /path/to/edited.png
é    N)ÚPath)ÚMODESÚbuild_prompt)Ú
build_plan)ÚscoreÚverdictc                 ó"   — dD ]
  }|| v sŒ|c S  y)N)ÚkitchenÚlivingÚbedroomÚroom© )Únamer   s     ú+/var/www/room-designer/pipeline/pipeline.pyÚ
_room_fromr      s"   € Ø0ò ˆØ�4Š<ØŠKðð ó    )ÚImageÚ	ImageDrawc                 ó�  — t        |«      }|j                  dd¬«       |dz  }t        j                  | «      j	                  d«      j                  |d¬«       |t        |   d   t        |   d   t        |«      d	d
œ}|dz  j                  t        j                  |d¬«      «       t        t        j                  |d¬«      «       y )NT)ÚparentsÚexist_okú
before.jpgÚRGBé\   )ÚqualityÚlabelÚ
aggressionz5muse-media-image-edit (Gemini-route stand-in, $0 API))ÚmodeÚ
mode_labelÚaggression_1_to_5ÚpromptÚbackend_stage1újob.jsoné   ©Úindent)r   Úmkdirr   ÚopenÚconvertÚsaver   r   Ú
write_textÚjsonÚdumpsÚprint)Úphotor   Újob_dirÚjobÚbeforeÚmetas         r   Úpreparer4   &   s¬   € Ü
ˆw‹-€CØ‡I�I�d T€IÔ*Ø�<Ñ€FÜ	‡J�JˆuÓ×Ñ˜eÓ$×)Ñ)¨&¸"Ð)Ô=àÜ˜D‘k 'Ñ*Ü" 4™[¨Ñ6Ü˜tÓ$ØQñ€Dð 	ˆ:Ñ×!Ñ!¤$§*¡*¨T¸!Ô"<Ô=Ü	Œ$�*‰*�T !Ô
$Õ%r   c                 óD  — t        j                  d| j                  dfd«      }t        j                  |«      }|j                  d|d¬«       t        j                  d| j                  | j                  dz   f«      }|j                  |d«       |j                  | d«       |S )	Nr   é$   )é   é   éI   )é   é   )éÿ   r<   r<   )Úfill©r   r   )r   r6   )r   ÚnewÚwidthr   ÚDrawÚtextÚheightÚpaste)ÚimgrB   ÚbarÚbar_drawÚouts        r   Ú_labelrI   6   s~   € Ü
�)‰)�E˜CŸI™I r˜?¨KÓ
8€CÜ�~‰~˜cÓ"€HØ‡M�M�(˜D €MÔ7Ü
�)‰)�E˜CŸI™I s§z¡z°B¡Ð7Ó
8€CØ‡I�Iˆc�6ÔØ‡I�Iˆc�7ÔØ€Jr   c                 ó   — t        | «      }t        j                  |dz  j                  «       «      }|dz  }t	        j
                  |«      j                  d«      j                  |«       t	        j
                  |dz  «      j                  d«      }t	        j
                  |«      j                  d«      }|j                  |j                  «      }|j                  |dz  «       t	        j                  d|j                  dz  dz   |j                  dz   f«      }|j                  t        |d	«      d
«       |j                  t        |d|d   › �«      |j                  dz   df«       |j                  |dz  «       |j                  «       }	|j                  dz  }
|	j                  |j!                  |
d|j                  |j                  f«      |
df«       t#        j$                  |	«      }|j'                  |
df|
|j                  fgdd¬«       |	j                  |dz  «       t)        t+        |dz  «      t+        |dz  «      «      }i |¥|t-        |«      dœ¥}|dz  j/                  t        j0                  |d¬«      «       t3        |j4                  «      }t7        |d   |«      }|j4                  |d<   |d   |d<   |dz  j/                  t        j0                  |d¬«      «       t9        t        j0                  ||d   |d   gdœd¬«      «       y )Nr#   z	after.pngr   r   zafter_matched.pngr$   é   r6   ÚBEFOREr>   zAFTER - r   r   zbefore_after.png)é¹   éŠ   é/   é   )r=   r@   zslider_mid.png)ÚscoresÚauto_verdictzqc.jsonr%   r   r1   rR   Úqc_gatez	plan.jsonÚtotal_cad_lowÚtotal_cad_high)ÚqcÚplan_total_cad)r   r,   ÚloadsÚ	read_textr   r(   r)   r*   ÚresizeÚsizer?   r@   rC   rD   rI   ÚcopyÚcropr   rA   Úliner   Ústrr   r+   r-   r   r   r   r.   )r0   Úafter_imager1   r3   ÚafterÚ
before_imgÚ	after_imgÚ
after_normÚsideÚwipeÚhalfÚdrQ   rV   r   Úplans                   r   Úfinishrj   @   s§  € Ü
ˆw‹-€CÜ�:‰:�s˜ZÑ'×2Ñ2Ó4Ó5€DØ�+Ñ€EÜ	‡J�Jˆ{Ó×#Ñ# EÓ*×/Ñ/°Ô6ä—‘˜C ,Ñ.Ó/×7Ñ7¸Ó>€JÜ—
‘
˜5Ó!×)Ñ)¨%Ó0€Ià×!Ñ! *§/¡/Ó2€JØ‡O�O�CÐ-Ñ-Ô.ä�9‰9�U˜Z×-Ñ-°Ñ1°AÑ5°z×7HÑ7HÈ2Ñ7MÐNÓO€DØ‡J�JŒv�j (Ó+¨VÔ4Ø‡J�JŒv�j H¨T°,Ñ-?Ð,@Ð"AÓBÀZ×EUÑEUÐXYÑEYÐ[\ÐD]Ô^Ø‡I�IˆcÐ&Ñ&Ô'ð �?‰?Ó€DØ×Ñ˜qÑ €DØ‡J�Jˆz�‰  a¨×)9Ñ)9¸:×;LÑ;LÐMÓNÐQUÐWXÐPYÔZÜ�‰�tÓ€AØ‡F�FˆT�1ˆI˜˜j×/Ñ/Ð0Ð1¸Èa€FÔPØ‡I�IˆcÐ$Ñ$Ô%ä”3�s˜\Ñ)Ó*¬C°Ð6IÑ0IÓ,JÓK€FØ	DˆDÐ	D˜F´G¸F³OÒ	D€BØˆ9�_× Ñ ¤§¡¨B°qÔ!9Ô:ô �c—h‘hÓ€DÜ�d˜6‘l DÓ)€DØ—(‘(€Dˆ�KØ˜Ñ(€Dˆ�OØˆ;Ñ×"Ñ"¤4§:¡:¨d¸1Ô#=Ô>Ü	Œ$�*‰*˜B°4¸Ñ3HÈ$ÐO_ÑJ`Ð2aÑbÐklÔ
mÕnr   Ú__main__r7   r4   r$   é   rP   rj   )Ú__doc__r,   ÚshutilÚsysÚpathlibr   ÚpathÚinsertr_   Ú__file__ÚparentÚmodesr   r   Úplan_enginer   Úqc_scorer   r   r   ÚPILr   r   r4   rI   rj   Ú__name__ÚargvÚexitr   r   r   ú<module>r|      sØ   ðñó" Û Û 
Ý à ‡�‡��‘3‘t˜H“~×,Ñ,Ó-Ô .ß %Ý "ß #ò÷
 !ò&ò ò#oðL ˆzÒØ
‡x�x��{�iÒÙ�—‘˜‘˜SŸX™X a™[¨#¯(©(°1©+Õ6Ø	�‰�!‰˜Ò	 Ùˆs�x‰x˜‰{˜CŸH™H Q™KÕ(àˆ�‰�Õð r   