o
    sgX                     @   s^   d dl m Z  d dlmZmZmZ d dlmZmZ d dlm	Z	m
Z
 d dlmZ G dd dZdS )	    )datetime)DictListOptional)HTTPExceptionstatus)AccountTypeUserBase)DynamoDBc                   @   s.  e Zd Zdd ZdedefddZdedee fdd	Z	ded
edefddZ
dededefddZdededefddZdededefddZdedefddZdedee fddZdededefddZdedee fddZdedefd d!Zd"ee dee fd#d$Zd"ee dee fd%d&Zd'S )(UserServicec                 C   s   t  | _d S )N)r
   db)self r   1/var/www/html/XCapMarket/services/user_service.py__init__   s   zUserService.__init__	user_inforeturnc           	      C   s   | d}| d}| j| jj|}|s| j| jj|}|r*tdi |ddS | d}| d}d|v rR|sR|d dd	}|d
 }t|d	krP|d	 nd}t|| d| d||tjd}| jjj	|
 d |ddS )zK
        Get existing user or create a new one if it doesn't exist
        subemailF)userObj	isNewUser
given_namefamily_namename    r   Nzcognito:username)user_idr   username
first_name	last_nameaccount_type)ItemTr   )getr   get_itemuserr	   splitlenr   BANKERput_item
model_dump)	r   r   r   r   existing_userr   r   
name_partsnew_userr   r   r   get_or_create_user   s.   





zUserService.get_or_create_userr   c                 C   s(   | j | j j|}|rtdi |S dS )z 
        Get user by ID
        Nr   )r   r#   r$   r	   )r   r   	user_datar   r   r   get_user_by_id4   s   zUserService.get_user_by_idr.   c                 C   sF   |  |}|sttjd| dd|  | j| jj|  |S )z%
        Update user details
        User with ID 
 not foundstatus_codedetail)	r/   r   r   HTTP_404_NOT_FOUNDupdate_modifyr   upload_to_dynamodbr$   r)   )r   r   r.   r*   r   r   r   update_user=      

zUserService.update_userprofile_pic_urlc                 C   sJ   |  |}|sttjd| dd|j|d | j| jj|  |S )z3
        Update user's profile picture URL
        r0   r1   r2   )profile_pic)	r/   r   r   r5   update_profiler   r7   r$   r)   )r   r   r:   r$   r   r   r   update_profile_pictureL   s   

z"UserService.update_profile_picturer    c                 C   sH   |  |}|sttjd| dd|| | j| jj|  |S )z,
        Update user's account type
        r0   r1   r2   )	r/   r   r   r5   update_account_typer   r7   r$   r)   )r   r   r    r$   r   r   r   r>   [   s   


zUserService.update_account_type	is_activec                 C   sT   |  |}|sttjd| dd|r|  n|  | j| jj|	  |S )z5
        Activate or deactivate user account
        r0   r1   r2   )
r/   r   r   r5   activate
deactivater   r7   r$   r)   )r   r   r?   r$   r   r   r   update_user_statusj   s   


zUserService.update_user_statusc                 C   sF   |  |}|sttjd| dd|  | j| jj|  |S )z4
        Update user's last login timestamp
        r0   r1   r2   )	r/   r   r   r5   update_last_loginr   r7   r$   r)   r   r   r$   r   r   r   rC   }   r9   zUserService.update_last_loginteam_idc                    s&   | j | j j} fdd|D }|S )z)
        Get all users in a team
        c                    s(   g | ]}| d  krtdi |qS )rE   r   )r"   r	   .0r$   rE   r   r   
<listcomp>   s    "z1UserService.get_users_by_team.<locals>.<listcomp>)r   get_all_table_itemsr$   )r   rE   	all_users
team_usersr   rH   r   get_users_by_team   s
   
zUserService.get_users_by_teamc                 C   sD   |  |}|sttjd| dd||_| j| jj|  |S )z'
        Update user's team ID
        r0   r1   r2   )	r/   r   r   r5   rE   r   r7   r$   r)   )r   r   rE   r$   r   r   r   update_user_team   s   

zUserService.update_user_teamc                 C   s   |  |}|r
|jS dS )z$
        Get user's team ID
        N)r/   rE   rD   r   r   r   get_user_team   s   
zUserService.get_user_teamr$   c              
   C   sV   z|   | j| jj|  |W S  ty* } zttjdt	| dd}~ww )z1
        Save a new user to the database
        zFailed to save user: r2   N)
r6   r   r7   r$   r)   	Exceptionr   r   HTTP_500_INTERNAL_SERVER_ERRORstr)r   r$   er   r   r   	save_user   s   zUserService.save_useruser_idsc           	      C   s   |sg S d}g }t dt||D ]7}||||  }dd |D }| jjjdd|iid}d|v rGd|d v rG|d d }|d	d |D  q|S )
zF
        Get multiple users by their IDs using batch get item
        d   r   c                 S   s   g | ]}d |iqS )r   r   )rG   r   r   r   r   rI      s    z0UserService.get_users_by_ids.<locals>.<listcomp>r$   Keys)RequestItems	Responsesc                 S   s   g | ]	}t d i |qS )r   )r	   rF   r   r   r   rI      s    )ranger&   r   dynamodbbatch_get_itemextend)	r   rU   
batch_sizerK   i	batch_idskeysresponseusersr   r   r   get_users_by_ids   s   
zUserService.get_users_by_idsc                 C   s   |  |}dd |D S )z}
        Get multiple active users by their IDs using batch get item
        Returns only users where is_active=True
        c                 S   s   g | ]}|j r|qS r   )r?   rF   r   r   r   rI      s    z7UserService.get_active_users_by_ids.<locals>.<listcomp>)rd   )r   rU   rc   r   r   r   get_active_users_by_ids   s   
z#UserService.get_active_users_by_idsN)__name__
__module____qualname__r   r   r	   r-   rR   r   r/   r8   r=   r   r>   boolrB   rC   r   rM   rN   rO   rT   rd   re   r   r   r   r   r   
   s    &	r   N)r   typingr   r   r   fastapir   r   models.userr   r	   utils.dynamo_dbr
   r   r   r   r   r   <module>   s    