
    {i                         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 ddlZddlZddlZ ej                   e      Z G d d	e      Zy)
z1
User seeder for creating initial user accounts.
    )Session)funcselectand_)User)encrypt_password)
BaseSeederNc                   N     e Zd ZdZ fdZdefdZdeddfdZdede	fdZ
 xZS )	
UserSeederz
    Seeder for creating initial user accounts.
    
    Creates an admin user with predefined credentials if it doesn't already exist.
    c                 >    t         |           d| _        d| _        y )Nzadmin@example.comadmin)super__init__admin_emailadmin_username)self	__class__s    `/var/www/html/hwPaymentPortal-be-dev/hw-payment-portal-api/src/apps/users/seeders/user_seeder.pyr   zUserSeeder.__init__   s    .%    returnc                     t         j                  t         j                  z   dz   dj                  fdt	        d      D              }|S )z1Generate a secure random password for admin user.z!@#$%^&* c              3   H   K   | ]  }t        j                          y w)N)secretschoice).0_
characterss     r   	<genexpr>z5UserSeeder.generate_admin_password.<locals>.<genexpr>!   s     I!7>>*5Is   "   )stringascii_lettersdigitsjoinrange)r   passwordr   s     @r   generate_admin_passwordz"UserSeeder.generate_admin_password   s;     ))FMM9JF
77IuRyIIr   dbNc                    t         j                  d       | j                         }	 t        |      }|st	        d      |j                  d      }t         j                  d       t        | j                  | j                  |ddd	d
dddddd      }	 |j                  |       |j                          t         j                  d|j                   d|j                   d       t         j                  d|        t         j                  d       y# t        $ r}t         j                  d|         d}~ww xY w# t        $ r}t         j                  d|         d}~ww xY w)zw
        Seed the users table with initial admin user.
        
        Args:
            db: Database session
        zCreating admin user...zPassword encryption failedzutf-8zPassword hashed successfullyzFailed to hash password: NAdminr   z
Admin User	admin_001TzSystem Administrator)emailusernamehashed_password
first_name	last_name	full_nameuser_id	is_activeis_verifiedis_superuserphonemiddle_namebiozCreated admin user:  (ID: )zAdmin password: z,IMPORTANT: Save the admin password securely!zFailed to create admin user: )loggerinfor'   r   
ValueErrordecode	Exceptionerrorr   r   r   addflushr,   idwarning)r   r(   admin_passwordencrypted_passwordr.   e
admin_users          r   seedzUserSeeder.seed$   sQ    	,- 557		!1.!A% !=>>077@OKK67 ""((+"&

 
	FF:HHJKK.z/?/?.@z}}oUVWXKK*>*:;<NNIJ7  	LL4QC89	:  	LL8<=	s0   >D A>D; 	D8D33D8;	E"EE"c                 P   t        t              j                  t        t        j                  | j
                  k(  t        j                  dk(              }|j                  |      j                         }|r1t        j                  d|j                   d|j                   d       yy)z
        Check if the user seeder should run.
        
        Args:
            db: Database session
            
        Returns:
            True if no admin user exists, False otherwise
        TzAdmin user already exists: r9   r:   F)r   r   wherer   r,   r   r5   executescalar_one_or_noner;   r<   rC   )r   r(   stmtexisting_admins       r   
should_runzUserSeeder.should_runY   s     d|!!

d...!!T)
 D)<<>KK5n6J6J5K6R`RcRcQddefgr   )__name__
__module____qualname____doc__r   strr'   r   rI   boolrP   __classcell__)r   s   @r   r   r      s@    &
 3w 34 3jW  r   r   )rT   sqlalchemy.ormr   
sqlalchemyr   r   r   src.apps.users.models.userr   src.core.utils.passwordr   !src.apps.base.seeders.base_seederr	   loggingr   r!   	getLoggerrQ   r;   r    r   r   <module>r`      sG    # ) ) + 4 8   			8	$_ _r   