
     i                         d dl mZmZ d dlZd dlmZmZ d dlZd dlmZ d dl	m
Z
 d dlZ e
         ej                  d      Z ej                  d      Z ej                  d      Z ej                  d	      Z G d
 d      Zy)    )
UploadFileHTTPExceptionN)BotoCoreErrorClientError)datetime)load_dotenv
AWS_REGIONBUCKET_NAMEAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYc            	       r    e Zd Zd ZdefdZddedededefdZded	efd
ZdefdZdefdZ	d Z
defdZy)	S3Servicec                 n    t         | _        t        j                  dt        t
        t              | _        y)z+
        Initialize the AWS client
        s3)region_nameaws_access_key_idaws_secret_access_keyN)r
   bucket_nameboto3clientr	   r   r   	s3_client)selfs    5/var/www/html/content_weaver/dependencies/awsutils.py__init__zS3Service.__init__   s(     '"/"7	
    directory_namec                     	 | j                   j                  | j                  | d       dd| diS # t        t        f$ r}t        dt        |            d}~ww xY w)	zP
        Create a 'directory' in S3 (actually a prefix ending with '/')
        /BucketKeymessagezDirectory 'z' created successfully.  status_codedetailN)r   
put_objectr   r   r   r   str)r   r   es      r   create_directoryzS3Service.create_directory   sl    	@NN%%T-=-=nEUUVCW%X^,<<STUU{+ 	@CA??	@s   14 AAAsanitized_namecontentContentTypec                 8   	 | d| }ddi}| j                   j                  t        |||       d| j                   d| j                   j                  j
                   d| }d| d	| d
|dS # t        t        f$ r}t        dt        |            d}~ww xY w)z=
        Upload a file to the specified S3 directory
        r   ACLzpublic-read)r    r!   Bodyr-   https://.s3..amazonaws.com/File 'z' uploaded to 'z' successfully.)r"   file_urlr#   r$   N)
r   r'   r
   r   metar   r   r   r   r(   )	r   r   r+   r,   r-   file_key
extra_argsr5   r)   s	            r   upload_objectzS3Service.upload_object&   s    	@()>*:;H/JNN%%"'	 &  "$"2"2!348K8K8W8W7XXghpgqrH!''7~FVVefs{||{+ 	@CA??	@s   A,A/ /B>BB
local_paths3_directoryc                    t         j                  j                  |      st        d|       t         j                  j	                  |      }| d| }	 | j
                  j                  |t        |ddi       dt         dt         d| }| j
                  j                  d	t        |d
d      }|||d| ddS # t        t        f$ r}t        d|       d}~ww xY w)an  
        Upload a locally generated IMSCC (ZIP) file to S3 in correct binary format
        and return both public URL & presigned URL.

        Args:
            local_path (str): Path like './result/MyCourse.imscc'
            s3_directory (str): Directory inside S3, e.g. 'Syllabuild_Courses/some-id'

        Returns:
            dict: URLs and metadata
        zIMSCC file not found: r   r-   zapplication/zip)Filenamer    r!   	ExtraArgsr1   r2   r3   
get_objectr   i  )Params	ExpiresInz	Uploaded z to S3 successfully.)s3_key
public_urlpresigned_urlr"   zS3 Upload failed: N)ospathexistsFileNotFoundErrorbasenamer   upload_filer
   r	   generate_presigned_urlr   r   	Exception)r   r:   r;   	file_namerB   rC   rD   r)   s           r   upload_imscc_to_s3zS3Service.upload_imscc_to_s39   s    ww~~j)#&<ZL$IJJGG$$Z0	 >9+.	6NN&&#"!#4	 '  $K=ZLPVxXJ !NNAA"-f= B M !(!.&yk1EF	  {+ 	60455	6s   A'B= =CCCc                     	 | j                   j                  | j                  | d      }d|vrdg iS |d   D cg c]  }|d   	 }}d|iS c c}w # t        t        f$ r}t        dt        |            d}~ww xY w)	z8
        Fetch files in a specific S3 directory
        r   r    PrefixContentsfilesr!   r#   r$   N)r   list_objects_v2r   r   r   r   r(   )r   r   responseobjrS   r)   s         r   fetch_objectzS3Service.fetch_objectk   s    	@~~55T=M=MYgXhhiVj5kH)}$+3J+?@CSZ@E@U## A{+ 	@CA??	@s-   1A A AA A A<!A77A<c                     	 | j                   j                  | j                  | d      }d|vrddiS t        d |d   D              }d|iS # t        t
        f$ r}t        dt        |            d	}~ww xY w)
z<
        Get the total size of files in a directory
        r   rP   rR   directory_sizer   c              3   &   K   | ]	  }|d      yw)SizeN ).0rV   s     r   	<genexpr>z/S3Service.get_directory_size.<locals>.<genexpr>   s     ISS[Is   r#   r$   N)r   rT   r   sumr   r   r   r(   )r   r   rU   
total_sizer)   s        r   get_directory_sizezS3Service.get_directory_sizey   s    	@~~55T=M=MYgXhhiVj5kH)(!,,IHZ4HIIJ$j11{+ 	@CA??	@s   1A A A7A22A7c                 l    d| j                    d| j                  j                  j                   d| }|S )Nr1   r2   r3   )r   r   r6   r   )r   r7   r5   s      r   get_object_urlzS3Service.get_object_url   s:    d../tDNN4G4G4S4S3TTcdlcmnr   r7   c                     	 | j                   j                  | j                  |       dd| diS # t        $ r}t	        dt        |            d}~ww xY w)z
        Delete a file from the S3 bucket.

        Args:
            file_key (str): The key (path) of the file to delete in the S3 bucket.

        Returns:
            dict: Success message.
        r   r"   r4   z' deleted successfully.r#   r$   N)r   delete_objectr   rL   r   r(   )r   r7   r)   s      r   delete_filezS3Service.delete_file   s]    	@NN((0@0@h(Oz1HIJJ 	@CA??	@s   .1 	AAAN)ztext/markdown)__name__
__module____qualname__r   r(   r*   r9   rN   rW   ra   rc   rf   r\   r   r   r   r      s    

@s @@C @ @s @ad @&06S 06 06d@# @@ @@C @r   r   )fastapir   r   r   botocore.exceptionsr   r   rE   r   dotenvr   jsongetenvr	   r
   r   r   r   r\   r   r   <module>ro      sq    -  : 	    RYY|$
bii&BII12 !		"9: J@ J@r   