
    =j3                     z   d 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mZmZ ddl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mZ ddlm Z  ddl!m"Z"m#Z#  eddg      Z$ eddg      Z%de&dedede fdZ'e$jQ                  d       ee       ee       ee      fde&dedede&dedefd       Z)e$jQ                  d       ee       ee       ee      fde&dede&dedef
d       Z*e$jQ                  d      d  ee       ee       ee      fde&ded!e+de&dedefd"       Z,e$jQ                  d#e$       ee       ee       ee      fd%e&dede&dedef
d&       Z-e$j]                  d'e/e   $       ee       ee       ee      fde&dedefd(       Z0e$j]                  d)       ee       ee       ee      fd%e&de&dedefd*       Z1e$j]                  d+e$       ee       ee       ee      fde&dedefd,       Z2e%jQ                  d-e$       ee       ee      fdededefd.       Z3y/)0u   내보내기 API 라우터.    )Path)	APIRouterDependsRequest)FileResponse)Session)get_dbget_current_userverify_project_access)settings)AppError)t)UserAccount)ExportFileResponsePDFValidationResponseProjectExportResponseProjectImportRequestProjectImportResponseWebbookGenerateRequest)ExportService)ProjectExportServiceProjectImportServicez/api/v1/projects/{project_id}exports)prefixtagsz/api/v1/projects
project_iddbuserreturnc                 2    t        || |j                        S )N)r   r   actor_id)r   id)r   r   r   s      H/Users/manta/Documents/Projects/TheRoad-I1/backend/app/api/v1/exports.py_make_servicer$   %   s    
      z'/episodes/{episode_id}/generate-webbook
episode_idbodyrequestcurrent_userc                     |j                   r|j                   j                  nd}t        |||      }|j                  | |j                  |j
                  |      }dt        d      |dS )z(Generate webbook package for an episode.N)r&   web_episode_countsections_per_episodeipTzexport.webbook_started)okmessagepackage)clienthostr$   generate_webbookr+   r,   r   )	r&   r'   r(   r   r   r)   r-   servicer0   s	            r#   r3   r3   1   sk     !(		DBJL9G&&00!66	 ' G 1%=#>7SSr%   z!/episodes/{episode_id}/render-pdfc                     |j                   r|j                   j                  nd}t        |||      }|j                  | |      }dt	        d      |D cg c]  }t        |      j                   c}dS c c}w )z3Render PDFs from existing webbook package + images.N)r&   r-   Tzexport.render_started)r.   r/   files)r1   r2   r$   render_pdfsr   r   name)	r&   r(   r   r   r)   r-   r4   pathsps	            r#   
render_pdfr;   F   ss     !(		DBJL9G:"=E,-(-.1$q',,.  /s   A5z&/episodes/{episode_id}/export-html-zipForiginalc                     |j                   r|j                   j                  nd}t        |||      }|j                  | ||      }t	        |      j
                  }	|rdnddz   }
d|	|
dS )u   씬별 원본 텍스트 + 이미지를 HTML로 만들어 ZIP 생성 (exports 디렉토리에 저장).

    original=true: 이미지를 JPEG 변환 없이 원본 파일(PNG 등) 그대로 export (무손실).
    N)r&   r-   r<   u   원본 PNG  u   HTML ZIP 생성 완료T)r.   filenamer/   )r1   r2   r$   generate_html_zipr   r8   )r&   r(   r<   r   r   r)   r-   r4   zip_pathr?   msgs              r#   export_html_ziprC   Y   sl     !(		DBJL9G((J2PX(YHH~""H$="0H
HCH==r%   z/exports/{filename}/validate)response_modelr?   c                     |j                   r|j                   j                  nd}t        |||      }|j                  | |      S )z)Validate a rendered PDF using GPT vision.N)r?   r-   )r1   r2   r$   validate_pdf)r?   r(   r   r   r)   r-   r4   s          r#   rF   rF   n   s?     !(		DBJL9Gb99r%   z/exportsc                 <    t        | ||      }|j                         S )zList all exported files.)r$   list_exports)r   r   r)   r4   s       r#   rH   rH   |   s!     JL9G!!r%   z/exports/{filename}c           	         t        t        j                        |z  }|dz  dz  }|| z  }	 |j                         j	                  |j                                |j                         r|j                         st        dt        d      d      ddd}|j                  |j                  d      }t        t        |      || d	d
|  di      S # t
        $ r t        dt        d      d      w xY w)zDownload an exported PDF file.assetsr   zexport.file_not_foundi  coder/   status_codezapplication/octet-streamzapplication/pdf)z.zipz.pdfzContent-Dispositionzattachment; filename="")path
media_typer?   headers)r   r   projects_dirresolverelative_to
ValueErrorr   r   existsis_filegetsuffixr   str)	r?   r   r   r)   project_direxports_dir	file_pathmedia_typesmedias	            r#   download_exportr`      s	    x,,-
:K(94Kh&I
''(;(;(=> Y%6%6%8(-.
 	
 6?PQKOOI,,.HIE^&*@
!(LM	 !  
(-.
 	

s   -C !C/z/exportc                     t        ||       }	 |j                         S # t        $ r  t        $ r}t        dt	        d      d      |d}~ww xY w)z)Export entire project as a JSON document.)r   r   zexport.failed  rK   N)r   export_jsonr   	Exceptionr   )r   r   r)   svcexcs        r#   export_project_jsonrg      s]     "
<C	     o&
 		s    AA		Az/importc                    t        ||j                        }	 |j                  | j                  | j                        }t        |t        d            S # t
        $ r  t        $ r}t        dt        d      d      |d}~ww xY w)	z0Import a project from an exported JSON document.)r   r!   )datanew_namezimport.failedrb   rK   Nzimport.success)r   r/   )	r   r"   import_jsonri   rj   r   rd   r   r   )r'   r   r)   re   new_pidrf   s         r#   import_project_jsonrm      s     "|
?C	//tyy4==/I !"#     o&
 		s   'A B(B  BN)4__doc__pathlibr   fastapir   r   r   fastapi.responsesr   sqlalchemy.ormr   
OrmSessionapp.api.depsr	   r
   r   app.core.configr   app.core.errorsr   app.i18n.loaderr   app.models.catalogr   app.schemas.exportr   r   r   r   r   r   app.services.export_servicer   #app.services.project_export_servicer   r   routerimport_routerrZ   r$   postr3   r;   boolrC   rF   rX   listrH   r`   rg   rm    r%   r#   <module>r      s   !  / / * 0 H H $ $  *  6 Z	*

 
			 	 		 67
 34V_ '(8 9TT
 T T 	T
 	T T 8T( 01 34V_ '(8 9  		
  2$ 56 34V_ '(8 9>>> > 	>
 	> > 7>( +<QR 34V_ '(8 9
:
:
: 
: 		
:
 
: S
: Jt,>'?@34V_ '(8 9""" " A" !" 34V_ '(8 9	### 	# 	# ##P I&;<34V_ '(8 9  =& I.CD V_ '(8 9
  Er%   