U
    ªiÓ,  ã                   @   sZ  d Z ddlZddlZddlZddlmZmZmZ G dd„ dƒZeƒ Z	d%e
ee
ef dœdd„Zee
ef d	œd
d„Zee
ef d	œdd„Zee
ef d	œdd„Zee
ef d	œdd„Zee
ef d	œdd„Zee
ef d	œdd„Zee
ef d	œdd„Zee
ef d	œdd„Ze
dœdd„Zed	œdd„Zed	œdd „Zee
e
f d	œd!d"„Zd#d$„ ZdS )&zi
Centralized Configuration Loader
Loads environment-specific configuration from config/environments.json
é    N)ÚDictÚAnyÚOptionalc                   @   s<  e Zd Zd&edœdd„Zdd„ Zedœdd	„Zd'eeeef d
œdd„Z	eeef dœdd„Z
eeef dœdd„Zeeef dœdd„Zeeef dœdd„Zeeef dœdd„Zeeef dœdd„Zeeef dœdd„Zeeef dœdd„Zedœdd„Zedœd d!„Zedœd"d#„Zeeef dœd$d%„ZdS )(ÚConfigLoaderN)Úconfig_file_pathc                 C   sT   |dkr*t j t j t¡¡}t j |d¡}|| _d| _d| _t	 
t¡| _|  ¡  dS )z
        Initialize the configuration loader
        
        Args:
            config_file_path: Path to the environments.json file
        Nzenvironments.json)ÚosÚpathÚdirnameÚabspathÚ__file__Újoinr   Úconfig_dataÚcurrent_envÚloggingÚ	getLoggerÚ__name__ÚloggerÚ_load_config)Úselfr   Úcurrent_dir© r   úA/var/www/html/testcasegenerator.evdpl.com/config/config_loader.pyÚ__init__   s    zConfigLoader.__init__c              
   C   s¬   zFt | jdƒ}t |¡| _W 5 Q R X |  ¡ | _| j d| j› ¡ W n` t	k
rp   | j 
d| j› ¡ ‚ Y n8 tjk
r¦ } z| j 
d|› ¡ ‚ W 5 d}~X Y nX dS )z!Load configuration from JSON fileÚrz&Configuration loaded for environment: zConfiguration file not found: z$Invalid JSON in configuration file: N)Úopenr   ÚjsonÚloadr   Ú_detect_environmentr   r   ÚinfoÚFileNotFoundErrorÚerrorÚJSONDecodeError)r   ÚfÚer   r   r   r      s    
zConfigLoader._load_config©Úreturnc                 C   s†   | j  di ¡ dd¡rxtj d¡}|r<|| j  di ¡kr<|S tj d¡sZdtj dd	¡kr^d
S dtj dd	¡ ¡ krxdS | j  dd
¡S )zDetect the current environmentÚsettingsZauto_detect_environmentTZAI_TEST_ENVÚenvironmentsz.envÚ	localhostÚHOSTÚ ÚdevelopmentÚ
productionÚENVIRONMENTZcurrent_environment)r   Úgetr   Úenvironr   ÚexistsÚlower)r   Zenv_from_varr   r   r   r   0   s    z ConfigLoader._detect_environment©Úenvironmentr%   c                 C   sH   |dkr| j }| j di ¡}||kr<| j d|› d¡ d}| |i ¡S )zô
        Get configuration for a specific environment
        
        Args:
            environment: Environment name (defaults to current environment)
        
        Returns:
            Configuration dictionary for the environment
        Nr'   zEnvironment 'z(' not found, falling back to developmentr+   )r   r   r.   r   Úwarning)r   r3   r'   r   r   r   Ú
get_configD   s    
zConfigLoader.get_configc                 C   s   |   | j¡S ©z-Get configuration for the current environment)r5   r   ©r   r   r   r   Úget_current_configX   s    zConfigLoader.get_current_configc                 C   s   |   ¡ }| di ¡S )ú"Get website-specific configurationÚwebsite©r8   r.   ©r   Úconfigr   r   r   Úget_website_config\   s    zConfigLoader.get_website_configc                 C   s   |   ¡ }| di ¡S )ú#Get database-specific configurationÚdatabaser;   r<   r   r   r   Úget_database_configa   s    z ConfigLoader.get_database_configc                 C   s   |   ¡ }| di ¡S )úGet AI-specific configurationÚair;   r<   r   r   r   Úget_ai_configf   s    zConfigLoader.get_ai_configc                 C   s   |   ¡ }| di ¡S )úGet integrations configurationÚintegrationsr;   r<   r   r   r   Úget_integrations_configk   s    z$ConfigLoader.get_integrations_configc                 C   s   |   ¡ }| di ¡S )úGet email configurationÚemailr;   r<   r   r   r   Úget_email_configp   s    zConfigLoader.get_email_configc                 C   s   |   ¡ }| di ¡S )úGet security configurationÚsecurityr;   r<   r   r   r   Úget_security_configu   s    z ConfigLoader.get_security_configc                 C   s   |   ¡ }| di ¡S )úGet logging configurationr   r;   r<   r   r   r   Úget_logging_configz   s    zConfigLoader.get_logging_config©r3   c                 C   sB   || j  di ¡kr,|| _| j d|› ¡ n| j d|› ¡ dS )úSet the current environmentr'   zEnvironment changed to: zInvalid environment: N)r   r.   r   r   r   r    )r   r3   r   r   r   Úset_environment   s    zConfigLoader.set_environmentc                 C   s   t | j di ¡ ¡ ƒS )ú"Get list of available environmentsr'   )Úlistr   r.   Úkeysr7   r   r   r   Úget_available_environments‡   s    z'ConfigLoader.get_available_environmentsc              
   C   sº   zz|   ¡ }ddddg}|D ]&}||kr| j d|› ¡  W dS q| di ¡ d¡}|sj| j d¡ W dS | j d	¡ W d
S  tk
r´ } z| j d|› ¡ W Y ¢dS d}~X Y nX dS )ú"Validate the current configurationr:   r@   rC   rL   zMissing required section: FÚurlzWebsite URL is requiredzConfiguration validation passedTz!Configuration validation failed: N)r8   r   r    r.   r   Ú	Exception)r   r=   Zrequired_sectionsÚsectionÚwebsite_urlr#   r   r   r   Úvalidate_config‹   s     
zConfigLoader.validate_configc                 C   s²  |   ¡ }i }| di ¡}| dd¡|d< | dd¡|d< | dd¡|d< t| d	d
¡ƒ|d< | di ¡}| dd¡|d< | dd¡|d< | dd¡|d< | dd¡|d< | dd¡|d< | di ¡}| dd¡|d< | dd¡|d< | dd¡|d< | dd¡|d< | di ¡}| di ¡}| dd¡|d < | d!d¡|d"< | d#d¡|d$< | d%i ¡}| dd¡|d&< | d'd¡|d(< | d)d¡|d*< | d+d¡|d,< | d-d¡|d.< | d/i ¡}	|	 d0d¡|d1< t|	 d2d3¡ƒ|d4< |	 d5d¡|d6< |	 d7d¡|d8< |	 d9d¡|d:< t|	 d;d<¡ƒ ¡ |d=< t|	 d>d?¡ƒ ¡ |d@< dA |	 dBg ¡¡|dC< | dDi ¡}
|
 dEd¡|dF< | dGi ¡}| dHdI¡|dJ< | dKdL¡|dM< t| dNd?¡ƒ ¡ |dO< |S )Pú4Export configuration as environment variables formatr:   rX   r*   ÚBASE_URLÚWEBSITE_URLÚhostr(   Z
FLASK_HOSTÚporti  Z
FLASK_PORTr@   Zmongodb_uriÚMONGODB_URIÚ
mongodb_dbÚ
MONGODB_DBZ	MONGO_URIZMONGO_DBZmongodb_collectionZMONGO_COLLECTIONrC   Úopenai_api_keyÚOPENAI_API_KEYZopenrouter_api_keyÚOPENROUTER_API_KEYZopenrouter_site_urlÚOPENROUTER_SITE_URLZopenrouter_site_nameÚOPENROUTER_SITE_NAMErF   ÚjiraÚJIRA_URLÚuserÚ	JIRA_USERÚ	api_tokenÚJIRA_API_TOKENZazure_devopsÚAZURE_DEVOPS_URLÚorgÚAZURE_DEVOPS_ORGÚprojectÚAZURE_DEVOPS_PROJECTÚpatÚAZURE_DEVOPS_PATZworkitem_idÚAZURE_DEVOPS_WORKITEM_IDrI   Úsmtp_serverÚEMAIL_SMTP_SERVERÚ	smtp_portiK  ÚEMAIL_SMTP_PORTÚusernameÚEMAIL_USERNAMEÚpasswordÚEMAIL_PASSWORDÚfrom_addressÚEMAIL_FROM_ADDRESSÚuse_tlsTÚEMAIL_USE_TLSÚuse_sslFÚEMAIL_USE_SSLú,Ú
recipientsÚEMAIL_RECIPIENTSrL   Zjwt_secret_keyÚJWT_SECRET_KEYr   Úlevelr   Z	LOG_LEVELÚfilezapp.logÚLOG_FILEZenable_mongo_loggerZENABLE_MONGO_LOGGER)r8   r.   Ústrr1   r   )r   r=   Úenv_varsr:   r@   rC   rF   rj   ÚazurerI   rL   Úlogging_configr   r   r   Úexport_to_env_format¤   sZ    z!ConfigLoader.export_to_env_format)N)N)r   Ú
__module__Ú__qualname__r   r   r   r   r   r   r5   r8   r>   rA   rD   rG   rJ   rM   rO   rR   rT   rV   Úboolr\   r‘   r   r   r   r   r      s    r   r2   c                 C   s
   t  | ¡S )z,Get configuration for a specific environment)Úconfig_loaderr5   rP   r   r   r   r5   ç   s    r5   r$   c                   C   s   t  ¡ S r6   )r•   r8   r   r   r   r   r8   ë   s    r8   c                   C   s   t  ¡ S )r9   )r•   r>   r   r   r   r   r>   ï   s    r>   c                   C   s   t  ¡ S )r?   )r•   rA   r   r   r   r   rA   ó   s    rA   c                   C   s   t  ¡ S )rB   )r•   rD   r   r   r   r   rD   ÷   s    rD   c                   C   s   t  ¡ S )rE   )r•   rG   r   r   r   r   rG   û   s    rG   c                   C   s   t  ¡ S )rH   )r•   rJ   r   r   r   r   rJ   ÿ   s    rJ   c                   C   s   t  ¡ S )rK   )r•   rM   r   r   r   r   rM     s    rM   c                   C   s   t  ¡ S )rN   )r•   rO   r   r   r   r   rO     s    rO   rP   c                 C   s   t  | ¡ dS )rQ   N)r•   rR   rP   r   r   r   rR     s    rR   c                   C   s   t  ¡ S )rS   )r•   rV   r   r   r   r   rV     s    rV   c                   C   s   t  ¡ S )rW   )r•   r\   r   r   r   r   r\     s    r\   c                   C   s   t  ¡ S )r]   )r•   r‘   r   r   r   r   r‘     s    r‘   c                  C   s,   t  ¡ } |  ¡ D ]\}}|r|tj|< qdS )z4Apply configuration to process environment variablesN)r•   r‘   Úitemsr   r/   )rŽ   ÚkeyÚvaluer   r   r   Úapply_to_process_env  s    r™   )N)Ú__doc__r   r   r   Útypingr   r   r   r   r•   r   r5   r8   r>   rA   rD   rG   rJ   rM   rO   rR   rT   rV   r”   r\   r‘   r™   r   r   r   r   Ú<module>   s*    [