U
    ui                   	   @   s  d dl mZmZmZmZmZmZmZ d dlm	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 d dlZd dlZd dlZd d	lmZ d dlZd dlZd
dlmZm Z m!Z!m"Z"m#Z#m$Z$m%Z% d
dl&m&Z& dZ'ee'ddidZ(edde(dZ)ej*j+e(d edddZ,dddgZ-e,j.ee-ddgdgd edZ/e/d Z0e/d Z1e0j2ddd e1j2ddd e,j3de	dd d!d" d#d$ Z4d@e5e5e5e5e6ee5 d%d&d'Z7e,8d(d)d* Z9e,:d+dee4fee5 ed,d-d.Z;e,:d/d
e#j<dee4fe5e5e=e#e6ed0d1d2Z>e,:d3ed4ee$j?edee4fe5eee e$e6ed5d6d7Z@e,8d8ee4fe5ed9d:d;ZAeBd<krd dlCZCeCjDe,d=d>d? dS )A    )FastAPI
UploadFileFileFormBackgroundTasksHTTPExceptionDepends)StaticFiles)CORSMiddleware)JSONResponseFileResponse)create_engine)sessionmakerSession)ListOptionalN)Path   )BaseOrder	OrderItemPhoto	PaperTypeFillModeOrderStatus)image_utilszsqlite:///./sql_app.dbZcheck_same_threadF)Zconnect_args)Z
autocommitZ	autoflushbind)r   zShowing Photo Servicez1.1.0)titleversionzhttp://localhost:3000zhttps://littlestory.co.kr*T)Zallow_originsZallow_credentialsZallow_methodsZallow_headersZuploadsoriginal	processed)parentsexist_okz/static)	directoryZstatic)namec                  c   s    t  } z
| V  W 5 |   X d S )N)SessionLocalclose)db r)   !/home/lhs5088/backend/app/main.pyget_db8   s    
r+   )photo_idoriginal_pathprocessed_path	fill_mode
print_date	date_textc              
   C   sp   z4d}t j||||d||d td|  d|  W n6 tk
rj } ztd|  d|  W 5 d}~X Y nX dS )z
    Reads from original_path, processes, saves to processed_path.
    Updates DB with processed_path is omitted here as we set it upfront, 
    but in a real scenario we might update a 'status' flag in DB.
    gUUUUUU?T)Z
input_pathZoutput_pathr/   Ztarget_ratio_w_hZ
do_enhancer0   r1   [z] Processed and saved to z] Error in processing: N)r   Zprocess_and_saveprint	Exception)r,   r-   r.   r/   r0   r1   Zprocess_ratioer)   r)   r*   process_image_task@   s    	r6   /c                   C   s   ddiS )NmessagezShowing Photo Service API v1.1r)   r)   r)   r)   r*   	read_rootY   s    r9   z/api/v1/orders)user_idr(   c                 C   s<   t | r
| ndd}|| |  || |j|jdS )NZGuest)r:   )order_idstatus)r   addcommitrefreshidr<   )r:   r(   Z	new_orderr)   r)   r*   create_order]   s
    

rA   z/api/v1/orders/{order_id}/items)r;   product_codequantity
paper_typer0   r(   c                 C   sf   | ttj| k }|s*tdddt| ||||d}|| |  |	| |j|j
dS )N  Order not foundstatus_codeZdetail)r;   rB   rC   rD   r0   )item_idrD   )queryr   filterr@   firstr   r   r=   r>   r?   rD   )r;   rB   rC   rD   r0   r(   orderZnew_itemr)   r)   r*   add_order_itemf   s    

rN   z%/api/v1/items/{item_id}/photos/upload.)rI   background_tasksfilesr/   r0   r(   c                    s8  | ttj| k }|s*tdddg }|p6|j}|D ]}	tt	 }
t
j|	jd }|sfd}|
 d| }t| }|
 d}t| }t|d}t|	j| W 5 Q R X t|
| t|t||	j|d	|	jr|	jnd
d}|| ||
d| d |jt|
t|t|||d q<|  dt||dS )NrE   zOrder Item not foundrG   r   z.jpgZ_origz	_proc.jpgwbTr   )r@   Zorder_item_idr-   r.   original_filenamer/   Zis_enhanced	file_sizez/static/processed/)r,   url)r,   r-   r.   r/   r0   zUpload successful)r8   Zuploaded_countphotos)rJ   r   rK   r@   rL   r   r0   struuidZuuid4ospathsplitextfilenameORIGINAL_DIRPROCESSED_DIRopenshutilcopyfileobjfiler   sizer=   appendZadd_taskr6   r>   len)rI   rO   rP   r/   r0   r(   itemZuploaded_photosZshould_print_datera   r,   extrR   r-   Zprocessed_filenamer.   bufferZ	new_photor)   r)   r*   upload_photosx   sX    	
 


	rh   z(/api/v1/admin/orders/{order_id}/download)r;   r(   c              	   C   s2  | ttj| k }|s*tdddtj|_|	  |j
rF|j
nd}ddd |D }| d| d	d
  d}t| }t|dtj}d}|jD ]~}|jj d|j }	|jD ]^}
t|
j}| st|
j}| r|j}| d|	 d|d| }|j||d |d7 }qqW 5 Q R X t|d|dS )zn
    Downloads images with renamed convention: {Customer}_{Option}_{Index}.jpg
    Uses PROCESSED images.
    rE   rF   rG   ZNoName c                 S   s    g | ]}|  s|d kr|qS ))-_)isalnum).0cr)   r)   r*   
<listcomp>   s       z)download_order_photos.<locals>.<listcomp>_order_N   z.zipwr   rk   Z03d)Zarcnamezapplication/zip)Z
media_typer[   )rJ   r   rK   r@   rL   r   r   ZDOWNLOADINGr<   r>   r:   joinBASE_UPLOAD_DIRzipfileZipFileZIP_DEFLATEDitemsrD   valuerB   rU   r   r.   existsr-   suffixwriter   )r;   r(   rM   Zcustomer_namezip_filenameZzip_pathzfZ
global_idxre   Z
option_strZphotoZtarget_pathrf   Znew_filenamer)   r)   r*   download_order_photos   s6    



r   __main__z0.0.0.0i@  )hostport)N)EZfastapir   r   r   r   r   r   r   Zfastapi.staticfilesr	   Zfastapi.middleware.corsr
   Zfastapi.responsesr   r   Z
sqlalchemyr   Zsqlalchemy.ormr   r   typingr   r   r_   rX   rW   pathlibr   ru   ioZmodelsr   r   r   r   r   r   r   r   ZSQLALCHEMY_DATABASE_URLZenginer&   metadataZ
create_allappZoriginsZadd_middlewarert   r\   r]   mkdirZmountr+   rV   boolr6   getr9   ZpostrA   ZGLOSSYintrN   Z
PAPER_FULLrh   r   __name__uvicornrunr)   r)   r)   r*   <module>   s|   $$	
 *C/
