
    ]i                         d Z ddlZddlmZ ddlmZ ddlmZ ddlm	Z	  ed      Z
dd	d
dZdededdfdZe G d d             ZdedededefdZdedefdZdedz  ddfdZdedededefdZy)u   File upload utility — local (dev) atau Google Drive (production).

Semua caller cukup buat UploadContext, tidak perlu tau path logic.
    N)	dataclass)date)Path)settingsuploadsjpgpngpdf)s   s   PNG   %PDFdatafilenamereturnc                     d|v r#|j                  dd      d   j                         nd}|dvrt        d|       t        j	                         D ]  \  }}| dt        |       |k(  s y | dd d	k(  ryt        d
      )z;Reject files whose content doesn't match a known safe type..    >   r   r
   r	   jpegzTipe file tidak didukung: N   r   z0Konten file tidak sesuai ekstensi yang diizinkan)rsplitlower
ValueError_ALLOWED_MAGICitemslen)r   r   extmagictyps        7/var/www/html/spbu.com/backend/app/utils/file_upload.py_validate_file_typer       s    14(//#q
!"
%
+
+
-bC
//5cU;<<$**,
sU% - BQx7
G
HH    c                   ,    e Zd ZU eed<   eed<   eed<   y)UploadContext	spbu_codetipetanggalN)__name__
__module____qualname__str__annotations__r    r!   r   r#   r#   $   s    N
IMr!   r#   tahunbulanc                     | j                  dd      j                  dd      }| |ddt        j                         j                  d d  d| S )N/_\02d-   )replaceuuiduuid4hex)r   r-   r.   safes       r   _unique_filenamer;   +   sR    C%--dC8DWU3Kq!1!1"1!5 6av>>r!   spbu_idc                    K   ddl m} ddlm} | j	                   ||j
                        j                  |j                  |k(               d{   }|j                         }|xs t        |      S 7 #w)zJFetch nomor_pertamina for a SPBU. Falls back to str(spbu_id) if not found.r   )select)SpbuN)

sqlalchemyr>   app.models.spbur?   executenomor_pertaminawhereidscalar_one_or_noner*   )dbr<   r>   r?   resultcodes         r   get_spbu_coderJ   0   s_     !$::fT%9%9:@@GASTUUF$$&D3w< Vs   AA5A3$A5
stored_urlc                 J  K   | syddl }|j                  t              }	 | j                  d      rddlm}  ||        y| j                  d      r(| t        d      d }t        |z  j                  d       yy# t        $ r}|j                  d| |       Y d}~yd}~ww xY ww)	u   
    Delete a previously uploaded file. Fire-and-forget — errors are logged, never raised.

    Handles both local paths (/uploads/...) and Google Drive URLs.
    Nr   zhttps://drive.google.com/)gdrive_delete	/uploads/T)
missing_oku$   delete_file: gagal hapus '%s' — %s)logging	getLoggerr'   
startswithapp.utils.gdriverM   r   
UPLOAD_DIRunlink	Exceptionwarning)rK   rP   loggerrM   reles         r   delete_filer[   9   s      x(F	N  !<=6*%"";/S-./C#%%%6 0  N=z1MMNs9   B#A: B# 8A: 8B#:	B BB#B  B#
file_bytesctxc                   K   t        | |       |j                  j                  }|j                  j                  }t	        |||      }t
        j                  rdnd}t
        j                  dk(  r&ddlm	}  || ||j                  |j                  |      S t        |z  |j                  z  |j                  z  }|j                  dd       ||z  j                  |        d| d	|j                   d	|j                   d	| S w)
z~
    Simpan file ke storage yang sesuai environment.

    Path: {env}/{spbu_code}/{tipe}/{tahun}{bulan}-{uuid}-{filename}
    livedevgdriver   )gdrive_uploadT)parentsexist_okrN   r0   )r    r&   yearmonthr;   r   is_productionSTORAGE_TYPErS   rb   r$   r%   rT   mkdirwrite_bytes)	r\   r   r]   r-   r.   unique_nameenvrb   dest_dirs	            r   save_uploadrn   O   s      
H-KKEKKE"8UE:K**&C(2ZcmmSXXsSSC#--/#((:HNN4$N/((4se1S]]O1SXXJa}EEs   C?D)__doc__r7   dataclassesr   datetimer   pathlibr   app.core.configr   rT   r   bytesr*   r    r#   intr;   rJ   r[   rn   r,   r!   r   <module>rv      s   
  !   $)_
 Ie Is It I   ?s ?3 ?s ?s ?
 S  S  N#* N N,F% F3 F] Fs Fr!   