
    HCi5                         d dl mZ d dlmZmZ d dlmZ d dlmZ d dl	m
Z
mZmZ d dlmZ d dlmZ d dlmZ d d	lmZmZmZmZmZ d d
lmZmZmZmZmZmZm Z m!Z!m"Z"m#Z#m$Z$ d dl%m&Z& d dl'm(Z(  ee)      Z* G d d      Z+y)    )Path)HTTPExceptionstatus)Session)setup_logger)ERR_NOT_FOUNDERR_FIELD_UPDATEERR_UNEXPECTED)ProjectMaster)ProjectRepository)ProductImageRepository)validate_overlay_filevalidate_logo_filesave_upload_file_streamedcreate_thumbnail_from_pathsafe_delete)ASSETS_ROOTproject_diroverlay_diroverlay_thumb_dirlogo_dirlogo_thumb_dir	final_dirfinal_thumb_dirrel_pathabs_from_dbcleanup_relative)crop_transparent_canvas)normalize_white_backgroundc                       e Zd ZdZededededefd       Zedede	de	d	ed
z  dedefd       Z
edede	fd       Zede	ded
z  ded
z  defd       Zedede	fd       Zy
)ProjectServicez!High-level project orchestration.project_nameclient_namesessionreturnc                 4  K   g }	 t        |       |r	 t        |       t        | |dddd      }	 |j                  |       |j                          |j                  |       g }|j                  }	 t!        |      j#                  dd       t%        |      j#                  dd       t'        |      j#                  dd       t)        |      j#                  dd       t+        |      j#                  dd       t-        |      j#                  dd       t/        |      j#                  dd       d}	d}
	 |rpt3        |t)        |             d{   j5                         }	|j7                  |	       t9        |	t+        |            j5                         }
|j7                  |
       d}d}	 t3        |t%        |             d{   j5                         }t=        |       t?        |d       |j7                  |       t9        |t'        |            j5                         }|j7                  |       	 tA        |      |_!        tA        |      |_"        |	rtA        |	      nd|_#        |
rtA        |
      nd|_$        |j                  |       |j                          |j                  |       |S # t        $ r  t        t        j                  t
              w xY w# t        $ r  t        t        j                  t
              w xY w# t        $ rA |j                          t        j                  d       t        t        j                  d      w xY w# t        $ rt t        j                  d|       	 |j1                  |       |j                          n# t        $ r |j                          Y nw xY wt        t        j                  d	      w xY w7 # t        $ r t        j                  d
|       |D ]  }t;        |        	 |j1                  |       |j                          n# t        $ r |j                          Y nw xY wt        t        j                  d      w xY w7 # t        $ r t        j                  d|       |D ]  }t;        |        	 |j1                  |       |j                          n# t        $ r |j                          Y nw xY wt        t        j                  d      w xY w# t        $ r t        j                  d|       |D ]  }t;        |        	 |j1                  |       |j                          n# t        $ r |j                          Y nw xY wt        t        j                  d      w xY ww)z
        Create a project with:
        - Overlay image + overlay thumbnail
        - Optional logo image + logo thumbnail
        - All stored paths are RELATIVE to assets/
        - Guaranteed cleanup on ANY failure
        detailN)r"   r#   overlay_image_pathoverlay_thumbnail_pathlogo_image_pathlogo_thumbnail_pathz$Failed to create initial project rowzFailed to create projectTparentsexist_okz6Failed to create project directories for project_id=%sz$Failed to create project directoriesz2Failed to save or thumbnail logo for project_id=%szFailed to process logo image   r1   r1   
target_rgbz5Failed to save or thumbnail overlay for project_id=%szFailed to save overlay imagezDFailed to update project DB with saved asset paths for project_id=%szFailed to save project assets)%r   	Exceptionr   r   HTTP_400_BAD_REQUESTr
   r   r   addcommitrefreshrollbacklogger	exceptionHTTP_500_INTERNAL_SERVER_ERRORidr   mkdirr   r   r   r   r   r   deleter   resolveappendr   r   r   r   r   r)   r*   r+   r,   )r"   r#   overlay_file	logo_filecurrent_userr$   created_filesproject
project_idlogo_abslogo_thumb_absfoverlay_absoverlay_thumb_abss                 N/var/www/html/story-book/Story-Book-python-api/app/services/project_service.pycreate_projectzProjectService.create_project'   s	    $ %'	T!,/
 X"9-
  %###'  $
	jKK NNOOG$ %'ZZ
	v
#))$)F
#))$)Fj)//t/LZ &&td&C:&,,TD,Ij!''t'DJ'--dT-J 	n";IxPZG["\\eeg$$X.!;HnU_F`!a!i!i!k$$^4  	n!:<U_I`!aajjlK#K0&{O  - :;HYZdHe f n n p  !23	o)1+)>G&-56G-HG*<Dhx&8$G#FT(>*BZ^G'KK NNOOG$NM  	T ; ;NSS	T  X#F$?$?WWX   	jCD E ENhii	j"  	vUWab#w'  #  "# E ENtuu	v ]  
	nQS]^"A ##w'  #  "# E ENlmm
	n  b  		nTV`a"A ##w'  #  "# E ENlmm		n,  
	oceop"A ##w'  #  "# E ENmnn
	os[  VJ7 VK# V2L #V2CM 6V;O OAO -V2Q4 
Q1A/Q4 ;A;T 6V7)K  V#)LVA
MVO<!NON:7O9N::OVO 1Q.!P32Q.3QQ.QQ..V1Q4 41T&!STS$!T#S$$TV1V8!UVU63V5U66VVpagelimitsearchNsort_byorderc                 8    t        j                  | |||||      S )Nr$   rO   rP   rQ   rR   rS   )r   list_advancedrU   s         rM   list_projectszProjectService.list_projects   s'     ..
 	
    rG   c           	      R   t        j                  | |      }|r|j                  rt        t        j
                  t              t        j                  | |      }g }|D ]D  \  }}|j                  |j                  |j                  |j                  |j                  |d       F ||fS )Nstatus_coder(   )r=   final_image_pathfinal_image_thumbnail_pathfinal_image_product_pathproduct_template)r   get_project
is_deletedr   r   HTTP_404_NOT_FOUNDr   r   list_with_templaterA   r=   r\   r]   r^   )r$   rG   rF   rowsimagesimgtpls          rM   get_project_detailz!ProjectService.get_project_detail   s    #//D',,F,E,Em\\%88*MHCMMff$'$8$8.1.L.L,/,H,H$'   rX   dbc                   K   t        j                  ||       }|r|j                  rt        t        j
                  t              t        ||||g      st        t        j                  t              |r||_
        |r||_        |sD|sB|j                  |       |j                          |j                  |       dd|j                  dS |j                   }|j"                  }	|j$                  }
|j&                  }d}d}d}d}t)        |       j+                  dd       t-        |       j+                  dd       t/        |       j+                  dd       t1        |       j+                  dd       t3        |       j+                  dd       |r	 t5        |       t7        |t-        |              d{   j9                         }t;        |       t=        |d       t?        |t/        |             }tG        |      |_        tG        |      |_        |rl	 tI        |       t7        |t1        |              d{   j9                         }t?        |t3        |             }tG        |      |_        tG        |      |_        	 |j                  |       |j                          |j                  |       tQ        |       tQ        |	       tQ        |
       tQ        |       dd|j                  dS 7 =# t@        $ r2 tC        |       tC        |       t        t        jD                  d	
      w xY w7 # t@        $ r2 tC        |       tC        |       t        t        jD                  d
      w xY w# t@        $ rn |jK                          tC        |       tC        |       tC        |       tC        |       tL        jO                  d|        t        t        jD                  d
      w xY ww)a*  
        Update project metadata and optionally regenerate final images when overlay changes.
        Handles template-count changes:
        - If new templates appear -> INSERT new rows
        - Else -> UPDATE existing rows only
        Ensures full rollback and file cleanup on failure.
        rZ   TzProject updated successfully.)successmessagerG   Nr-   r0   r2   zFailed to update overlay imager'   zFailed to update logo imagez-Failed to update project DB for project_id=%szProject update failed))r   r`   ra   r   r   rb   r   anyr5   r	   r"   r#   r6   r7   r8   r=   r)   r*   r+   r,   r   r>   r   r   r   r   r   r   r@   r   r   r   r4   r   r<   r   r   r9   r:   r;   r   )rG   r"   r#   rB   rC   rD   ri   rF   old_overlayold_overlay_thumbold_logoold_logo_thumbnew_overlay_absnew_overlay_thumb_absnew_logo_absnew_logo_thumb_abss                   rM   update_projectzProjectService.update_project   s    $ $//J?',,F,E,Em\\L+|YGHF,G,GP`aa#/G "-G IFF7OIIKJJw:%jj  00#::** 44  $! 	J%%dT%BJ%%dT%B*%++D4+H""4$"?z"(((E 	t%l3)B<Q\]gQh)i#i"r"r"t'8*?W(B?TefpTq(r% *2/)BG&-56K-LG* q"9-&?	8T^K_&` `iik%?n]gNh%i" '/|&<G#*23E*FG'	gFF7OIIKJJw 	%*+"( 6!**
 	
] $j  tO,12#F$I$IRrsst !a qL)./#F$I$IRoppq  	gKKM(-.%*+LjY E ENeff	gss   FO.#K6 6K37?K6 6"O.#L6 <L4='L6 $ O.2M4 7<O.3K6 6;L11O.4L6 6;M11O.4A7O++O.c                    t        j                  | |      }|st        t        j                  t
              t        j                  | |       t        j                  | |      }|D ]%  }	 t        |j                        }|rt        |       ' t        j                  | |       y # t        $ r# t        j                  d|j                         Y jw xY w)NrZ   z%Failed to delete final image file: %s)r   r`   r   r   rb   r   soft_delete_projectr   list_by_projectr   r\   r   r4   r:   r;   delete_by_project)r$   rG   rF   re   rf   abs_paths         rM   delete_projectzProjectService.delete_projectD  s    #//DF,E,Em\\ 	--gw? (77LC`&s';';<)  	00*E  `  !H#J^J^_`s   *"B%%)CC)__name__
__module____qualname____doc__staticmethodstrr   r   rN   intrW   rh   rv   r|    rX   rM   r!   r!   $   s   +GoGoGo Go 
Go GoR 
w 
c 
# 
sTz 
\_ 
hk 
 
 G   & q
q
Djq
 4Zq
 q
 q
f F FS F FrX   r!   N),pathlibr   fastapir   r   sqlmodelr   app.core.loggingr   app.core.constantsr   r	   r
   app.models.project_masterr   app.repositories.project_repor   #app.repositories.product_image_repor   app.utils.imager   r   r   r   r   app.utils.pathsr   r   r   r   r   r   r   r   r   r   r   app.utils.image_cropr   app.utils.image_backgroundr   r}   r:   r!   r   rX   rM   <module>r      s^     )  ) N N 3 ; F     9 A	h	tF tFrX   